EDIT:SOLVED。申し訳ありませんが、私のデータの読み込みがバックグラウンドスレッドで行われている間に、データを解析したコールバックは発生していませんでした。データの解析には非常に時間がかかり、それがスレッドをロックしていたものです。UIスレッドをロックしてdoinbackgroundでASynchTaskをスリープします
EDIT:UIスレッドがブロックされているのではなく、ProgressDialogを使用しているという問題が、私の最も重要な問題(ProgressDialogが回転しなくなった)に起因する可能性があることがわかりました。そのような場合は、どうすれば修正できますか?
EDIT:明確にするために、これはプログラム全体を永久にロックしません。すべてがロードされると、進行状況ダイアログが閉じられ、新しいアクティビティが起動されます。私の問題は、それは、全体のUIはロックアップロードしている間ということである(すなわちprogressdialogが停止したスピニング)
TL; DRは:doInBackgroundでのThread.sleep()は()UIスレッド、私が持っている
をロックしています特定のアクティビティが開かれると、スケジュールに関連する大量のデータなど、バックエンドから多数のデータをバックグラウンドで読み込み始めます。この情報はすぐには使用されませんが、ユーザーがアクセスしようとすると(スケジュールボタンをクリックしてスケジュールアクティビティを起動して)使用することができます。
ユーザーは、スケジュールボタンをクリックする前に、データロードのすべてを少し待つ場合は、スケジュール・アクティビティが開き、偉大なすべてのものを表示します。私の問題は、データが読み込まれる前にボタンをクリックした場合です。ここ
私のソリューションは、定期的にデータの読み込みが完了したかどうかをチェックし、そうでない場合は寝ている間ProgressDialogを示しASyncTaskを作成することでした。データがいくつかのアプリケーション全体のブール変数を介してロードされたことを知っています。私の問題は、Thread.sleep()がdoinbackground()内で実行されても、UIスレッドをロックしているということです。
私は以下に定義されたカスタムASyncTask、使用しています:
public class LoadWithProgressDialog extends AsyncTask<Void, Void, Boolean>{
private ProgressDialog pd; //the progress dialog
private String title; //the title of the progress dialog
private String message; //the body of the progress dialog
private Runnable task; //contains the code we want to run in the background
private Runnable postTask; //execute when the task ends
private Context c;
public LoadWithProgressDialog(Context context,String t, String m,Runnable r, Runnable postR){
super();
c = context;
task = r;
postTask = postR;
title = t;
message = m;
}
@Override
protected void onPreExecute(){
pd = ProgressDialog.show(c,title, message, false, false);
}
@Override
protected Boolean doInBackground(Void... params) {
task.run();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
pd.dismiss();
if(postTask != null)
postTask.run();
}
と(例えば)を介して、それを呼び出す:
if(loadingSchedule){
LoadWithProgressDialog lwpd = new LoadWithProgressDialog(thisClass,"Loading","Loading Schedule", new Runnable() {
public void run(){
while(loadingSchedule){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},new Runnable() {
public void run(){
Intent i= new Intent(thisClass, Schedule.class);
i.putExtra("numberIneed",index);
startActivity(i);
}
});
lwpd.execute();
(Iが "loadingSchedule" にグローバル変数へのアクセスを短縮します
UIスレッドをロックしないようにするにはどうすればよいですか?
申し訳ありませんが、私の編集を参照してください。バックグラウンド読み込みが完了すると、すべてが再び動作します。その期間だけロックされます(ProgressDialogは回転しません)。 UIがロックされたときを特定する方法はわかりません。なぜなら、progressdialogの回転を維持しなければならないコード以外のコードは実行されていないからです(私は書きませんでした)。 –