次のシナリオのデザインパターンまたはアプローチを探しています。異なるソースからのデータ取得のために、2つの別々のバックグラウンドスレッドを開始したいと思います。次に、両方のバックグラウンドスレッドが作業を完了したら、(UIスレッド上の)1つのメソッドを呼び出す必要があります。2つのソースからのデータを組み合わせる必要があるため、データを操作する前に、両方の取得が完了するまで待つ必要があります。Androidプラットフォームでこれを実現するにはどうすればよいですか?
質問する
164 次
3 に答える
2
編集:私の最初のバージョンは私を悩ませてきました、そして私はそれに必要な追加のブール値が気に入らなかったので、ここに別のバージョンがあります。追加された各タスクのthis
fromで呼び出します。onPostExecute
ArrayList<AsyncTask> tasks;
public void doStuffWhenDone(AsyncTask finishedTask)
{
tasks.remove(finishedTask);
if(tasks.size() > 0)
return;
... do stuff
}
どちらも機能するので、古いものも維持しますが、上記の方がはるかにクリーンだと思います。さて、私の以前のプロジェクトの1つを片付けましょう。
ArrayList<AsyncTask> tasks;
boolean hasBeenDone = false;
public void doStuffWhenDone()
{
for(int i=0;i<tasks.size();i++)
if(hasBeenDone || (tasks.get(i).getStatus() != AsyncTask.Status.FINISHED))
return;
hasBeenDone = true;
... do stuff
}
どんなに多くのタスクを実行しても簡単に拡張でき、スレッドを処理するためのスレッドは必要ありません。各タスクの最後にメソッドを呼び出すだけです。それが最後に行われたものでなければ、何も起こりません。
編集:良い点ですが、アトミックである必要はないと思います。両方のAsyncTasksのonPostExecute
メソッドはUIスレッドで実行されるため、次々に呼び出されます。
于 2012-10-12T14:57:41.810 に答える
1
次のように、 CountDownLatchを使用します。
CountDownLatch barrier = new CountDownLatch(2); // init with count=2
startWorkerThread1(barrier);
startWorkerThread2(barrier);
barrier.await(); // it will wait here until the count is zero
doStuffWithTheResult();
ワーカースレッドが終了したら、そこからbarrier.countDown()を呼び出します。
于 2012-10-12T12:24:22.043 に答える
0
とを使用AsyncTask
しint
て、両方のジョブが終了したかどうかを知ることができます...
于 2012-10-11T22:56:39.197 に答える