asynctask ProgressDialogは.get()で表示されていません
-
11-12-2019 - |
質問
バックグラウンド処理のためにAsyncTask
サブクラスを使用しています。問題は、.get()
メソッドでクラスを使用すると、ProgressDialog
で指定されているonPreExecute()
が表示されません。
onPostExecute()
メソッドを使用してコールバックを使用するとうまく機能します。
私の最初の考えは、.get()
がプロセスが完了するのを待つが、UIスレッドをブロックすることができないので、そのような場合はそのようなものではありません。
誰かがこの行動がそうである理由を説明することができます、そして、このために回避策があるならば?できる場合は.get()
メソッドを本当に使用したいです。
解決
私は最初に他の答えを受け入れましたが、それは間違っているようです。
.get()
メソッドは、結果が待つためにUIスレッドをブロックし、表示されているダイアログもブロックされます。これはこの方法の予想される動作です。
背景の活動が顕著な時間の場合、呼び出し中のコールバックメソッドを呼び出しアクティビティに使用する場合、唯一の選択肢は.get()
を使用しないことです。
他のヒント
呼び出し aysnctask.get()UIスレッドでは、UIスレッド実行をブロックし、aysnctask.doinbackground()を終了するのを待っているUIスレッドを作ります。これを行うことで、あなたは実際にはasycntaskの利点を犠牲にしています、今やすべてのコードはUIスレッドとバックグラウンドスレッド(まだ2つのスレッドのスレッドでは現在のスレッドを待つ)で同期的に実行されます。
はまた、UIスレッドでget()を呼び出すことによって、おそらくANR例外(5秒以上ブロックされている)を得ることに留意しています。
本当にそれを使用する必要がある場合は、myAsynctask.get()の前にshowDialog()メソッドを呼び出します。
showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.
.
これが役立つことを願っています。