4

Async タスクを使用していくつかの名前を含む xml ファイルを解析し、メイン スレッドを介してこれらの名前をリストビューに再度入力しています。しかし、私の場合、非同期タスクがまだ実行されているときに、メインスレッドがリストビューに名前を既に入力しているため、リストビューにアイテムがありません。非同期タスクがジョブを終了するまでメインスレッドを待機させる必要がありますか、またはこの問題を解決する他の方法はありますか? はいの場合、非同期タスクが完了するまでにかかる時間がわからない場合、どうすればメインスレッドを待機させることができますか?

4

6 に答える 6

6

AsycTaskを完了したい場合は、AsyncTaskの.get()メソッドを使用できます。(これはMainUiThreadをブロックします

しかし、最善のアプローチは、MainUiThreadをブロックせずに、 ProgressDialogを開始し、AsyncTaskのListViewにデータを入力しonPreExecute()た後、 ProgressDialogを終了することだと思います。onPostExecute()onPostExecute()

于 2013-01-08T11:12:19.643 に答える
5

AsyncTask を使用した場合は、doInBackground() で xml フェッチを実行し、onPostExecute() 内のリストビューのすべての UI 要素を更新します。これはメイン UI スレッドで実行され、自動的に doInBackground() の後に実行されます。この方法では、UI スレッドを明示的に待機させる必要はありません

于 2013-01-08T11:27:52.930 に答える
3

メインスレッドをブロックして非同期タスクを待つ必要はありません(これにより、非同期タスクの目的が損なわれます)。代わりに、非同期タスクは、onPostExecuteメソッドで終了したときに更新をトリガーする必要があります。

Loader最近のデザインもご覧ください。

于 2013-01-08T11:11:33.170 に答える
3

-まず、 AndroidMainのスレッドはです。Dedicated UI thread

-あなたがする必要があるのは、xmlを名前で解析してリストを埋めてから、ListViewでの表示に進むことです。

-fromパッケージを使用CoundDownLatchjava.util.concurrentて、に表示する前にデータをリストに入力できますListView

-await()これを行うには、およびcountDown()のようなメソッドを使用しCoundDownLatchます。

于 2013-01-08T11:12:24.887 に答える
2

AsyncTask.get()を使用 して、AsyncTaskが終了するまで待機します。

注:これにより、結果がAsyncTaskから取得されなくなるまで、メインテーマの実行が停止します。

于 2013-01-08T11:11:47.323 に答える
0
String str_result= new RunInBackGround().execute().get();
Log.e("","show this");

RunInBackGround は AsyncTasc クラス名です。最初に非同期タスクを実行し、終了すると次のメッセージが表示されます!

于 2016-01-08T11:26:36.033 に答える