3

我正在为以下场景寻找设计模式或方法。我希望启动两个独立的后台线程,以便从不同来源检索数据。然后,我希望在两个后台线程都完成工作后调用一种方法(在 UI 线程上)。由于来自两个来源的数据必须结合起来才能发挥作用,所以我必须等到两者都完成检索后才能操作数据。如何在 Android 平台上实现这一点?

4

3 回答 3

2

编辑:我的第一个版本一直困扰着我,我不喜欢添加必要的布尔值,所以这是另一个版本。thisonPostExecute每个添加的任务中调用它。

ArrayList<AsyncTask> tasks;

public void doStuffWhenDone(AsyncTask finishedTask)
{
    tasks.remove(finishedTask);
    if(tasks.size() > 0)
        return;

    ... do stuff
}

我也会保留旧的,因为它们都可以工作,但我认为上面的内容要干净得多。现在去整理我早期的一个项目。

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 回答