4

と の 2 つの異なる実装がありAsyncTaskます。AT1AT2

AT1が最初に実行され、次にAT2が実行されます。500 ミリ秒ごとにこのデータをポーリングして、タスクが完了するまでAT1待機します。しかし、これは決して起こりません。doInBackgroundAT2

だから私が基本的に欲しいのはこれです: ここに画像の説明を入力

ここに画像の説明を入力
しかし、何が起こっているように見えるかというと、次 のようにAT1なりAT2ます。

AsyncTaskこれら 2 つの s を 2 つの別々のスレッドで強制的に実行する方法はありますか、それとも別の解決策がありますか?

最初に起動AT2してから実行することはできませんAT1

編集
明確にするために:AT1ユーザーが特定の画面を開いたときに実行され、場所に基づいてその画面のデータをダウンロードする必要があります。AT2場所の変更時に実行され、それが発生すると、UI スレッドでは実行できないいくつかの計算が行われます。

AT2一度も実行されていない場合AT1、データをダウンロードする場所がないためAT2、完了するまで待機する必要があります。が実行されると、位置データAT2 すでにそこにあるAT1ため、待機する必要はありません。

また、この回答が示唆するように、この問題は Android 2.3 ではなく ICS で発生します。

4

3 に答える 3

3

この質問を投稿したとき、この質問Relatedセクションに表示されました。を使用することをお勧めしますexecuteOnExecutor。これを次のように実装しました。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    new SetLocationAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location);
} else {
    new SetLocationAsyncTask().execute(location);
}
于 2012-06-13T08:08:50.667 に答える
0

ロジックを再考する必要があるように思えます - 別のスレッドが何らかの作業を行うのを待つ必要があるスレッドを開始している場合、最初のスレッドにその作業をさせてみませんか?

本当に 2 つの AsyncTasks が必要な場合は、最初のタスクで必要なデータを収集し、最初のタスクが完了するまで 2 つ目のタスクを開始しないでください。ドキュメントで onPostExecute について読んでください。

于 2012-06-13T07:56:11.400 に答える
0

一方が他方を待機する場合、2 つの非同期タスクを使用する意味は何ですか? それをやりたいのなら、最初のタスクで 2 番目のタスクを開始し、「完了」したものを 2 番目のタスクに入れてみませんか?

于 2012-06-13T07:53:38.503 に答える