我正在为以下场景寻找设计模式或方法。我希望启动两个独立的后台线程,以便从不同来源检索数据。然后,我希望在两个后台线程都完成工作后调用一种方法(在 UI 线程上)。由于来自两个来源的数据必须结合起来才能发挥作用,所以我必须等到两者都完成检索后才能操作数据。如何在 Android 平台上实现这一点?
问问题
164 次
3 回答
2
编辑:我的第一个版本一直困扰着我,我不喜欢添加必要的布尔值,所以这是另一个版本。this
从onPostExecute
每个添加的任务中调用它。
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
您可以使用AsyncTask
和int
来了解这两项工作是否已完成...
于 2012-10-11T22:56:39.197 回答