3

次のシナリオのデザインパターンまたはアプローチを探しています。異なるソースからのデータ取得のために、2つの別々のバックグラウンドスレッドを開始したいと思います。次に、両方のバックグラウンドスレッドが作業を完了したら、(UIスレッド上の)1つのメソッドを呼び出す必要があります。2つのソースからのデータを組み合わせる必要があるため、データを操作する前に、両方の取得が完了するまで待つ必要があります。Androidプラットフォームでこれを実現するにはどうすればよいですか?

4

3 に答える 3

2

編集:私の最初のバージョンは私を悩ませてきました、そして私はそれに必要な追加のブール値が気に入らなかったので、ここに別のバージョンがあります。追加された各タスクのthisfromで呼び出します。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

とを使用AsyncTaskintて、両方のジョブが終了したかどうかを知ることができます...

于 2012-10-11T22:56:39.197 に答える