質問

バックグラウンド処理のために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.
.

これが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top