1

AsyncTaskバックグラウンド処理にサブクラスを使用しています。.get()問題は、メソッドでクラスを使用すると、ProgressDialogで指定したonPreExecute()ものが表示されないことです。

メソッドでコールバックを使用すると、問題なく動作しますonPostExecute()

私が最初に考えたのは、これは.get()プロセスが完了するのを待っているが、UI スレッドをブロックすることはできないため、そうではないということでした。

この動作の理由と、これに対する回避策があるかどうかを誰かが説明できますか?? .get()可能であれば、その方法を使用したいと思います。

4

2 に答える 2

3

最初は他の答えを受け入れましたが、間違っているようです。

メソッドは.get()UI スレッドをブロックして結果を待機し、表示されるダイアログもブロックします。これは、このメソッドの予想される動作です。

唯一の代替手段は.get()、バックグラウンド アクティビティがかなり長い間使用されている場合は使用せず、代わりに呼び出し側アクティビティへのコールバック メソッドを使用することです。

于 2012-06-14T20:11:44.823 に答える
1

UI スレッドでAysncTask.get()を呼び出すと、UI スレッドの実行がブロックされ、UI スレッドが AysncTask.doInBackground() の終了を待機するようになります。これを行うと、実際には AsycnTask の利点が犠牲になります。すべてのコードが UI スレッドとバックグラウンド スレッドで同期的に実行されるようになりました (2 つのスレッドのままですが、UI スレッドはバックグラウンド スレッドを待機するようになりました)。

また、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.

お役に立てれば。

于 2012-05-18T21:36:50.937 に答える