Async タスクを使用していくつかの名前を含む xml ファイルを解析し、メイン スレッドを介してこれらの名前をリストビューに再度入力しています。しかし、私の場合、非同期タスクがまだ実行されているときに、メインスレッドがリストビューに名前を既に入力しているため、リストビューにアイテムがありません。非同期タスクがジョブを終了するまでメインスレッドを待機させる必要がありますか、またはこの問題を解決する他の方法はありますか? はいの場合、非同期タスクが完了するまでにかかる時間がわからない場合、どうすればメインスレッドを待機させることができますか?
6 に答える
AsycTaskを完了したい場合は、AsyncTaskの.get()
メソッドを使用できます。(これはMainUiThreadをブロックします)
しかし、最善のアプローチは、MainUiThreadをブロックせずに、 ProgressDialogを開始し、AsyncTaskのListViewにデータを入力しonPreExecute()
た後、 ProgressDialogを終了することだと思います。onPostExecute()
onPostExecute()
AsyncTask を使用した場合は、doInBackground() で xml フェッチを実行し、onPostExecute() 内のリストビューのすべての UI 要素を更新します。これはメイン UI スレッドで実行され、自動的に doInBackground() の後に実行されます。この方法では、UI スレッドを明示的に待機させる必要はありません
メインスレッドをブロックして非同期タスクを待つ必要はありません(これにより、非同期タスクの目的が損なわれます)。代わりに、非同期タスクは、onPostExecute
メソッドで終了したときに更新をトリガーする必要があります。
Loader
最近のデザインもご覧ください。
-まず、 AndroidMain
のスレッドはです。Dedicated UI thread
-あなたがする必要があるのは、xmlを名前で解析してリストを埋めてから、ListViewでの表示に進むことです。
-fromパッケージを使用CoundDownLatch
しjava.util.concurrent
て、に表示する前にデータをリストに入力できますListView
。
-await()
これを行うには、およびcountDown()
のようなメソッドを使用しCoundDownLatch
ます。
AsyncTask.get()を使用 して、AsyncTaskが終了するまで待機します。
注:これにより、結果がAsyncTaskから取得されなくなるまで、メインテーマの実行が停止します。
String str_result= new RunInBackGround().execute().get();
Log.e("","show this");
RunInBackGround は AsyncTasc クラス名です。最初に非同期タスクを実行し、終了すると次のメッセージが表示されます!