【问题标题】:how to wait multiple asynctask to finish their work?如何等待多个异步任务完成他们的工作?
【发布时间】:2015-08-02 02:39:53
【问题描述】:

我正在使用ThreadPoolExeecutor 让 3 个 Asynctask 同时工作。每个线程都从一个Arraylist 的 RSS 提要中收集数据,然后我想将这 3 个 Arraylist 合并为一个以更新主线程中的视图。问题是我需要在所有 3 个线程完成工作后执行此操作,如何监听这些线程?

【问题讨论】:

    标签: android json rss android-volley xmlreader


    【解决方案1】:

    使用CountDownLatch。这个java类为你提供了方便的同步计数器。初始化一个计数为 3 的对象,调用await(),然后在每个任务完成时调用countDown()。一旦它为 0,锁将被释放,您可以执行您的任务。

    【讨论】:

    • 如果我在主线程中调用await(),它将被阻塞。所以我应该把await()放在第四个线程中?
    • 是的。创建一个将调用await() 的线程。释放锁定后,您可以执行您的操作。如果您需要执行 UI 操作,您可以使用 UI 处理程序:public void run() {countDownLatch.await(); uiHandler.post(yourRunnable);}
    【解决方案2】:

    创建一个成员变量并初始化为 0,每次 onPostExecute 递增。还要检查onPostExecute的值是否为3,是否为3调用方法来组合arraylist。

    【讨论】:

    • 如果并发修改,最好使用AtomicInteger
    【解决方案3】:

    您可以调用异步任务获取函数来等待它完成,或者您可以持有一个计数器,每个任务都会在其 onPostExecute 函数中增加。一旦计数器值成为异步任务的数量,执行您的代码。

    【讨论】:

    • 调用 get 函数会阻塞你的 UI,直到它完成。不要那样做。
    猜你喜欢
    • 2013-05-26
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多