繁体   English   中英

如何在 android 中等待多个线程完成而不阻塞 ui?

[英]How to wait for multiple threads to finish without blocking ui in android?

我正在使用 threadPoolExecuter 在线程上并行执行任务,我想等待所有任务完成而不阻塞主 ui。 我不想在这里使用异步任务。 和 service.awaitTermination() 之类的方法阻止了主 ui。我检查了类似的问题,但没有找到我的特定问题的答案。 我正在使用for循环将runnables传递给这样的线程:

for (ApplicationInfo info : applicationInfoList) {
        service.execute(new MyTask(info));
    }

MyTask() function 在这里对所有 ApplicationInfo 类型的对象执行相同的操作。 请帮忙.....

好吧,我可以看到您正在使用 java,所以可能由于某种原因不允许您使用协程。 使用协程,更容易实现这样的结果。 考虑使用它们,尤其是看看它们解决问题的方法。

在您的情况下,我会使用 - CountDownLatch

您的代码将与此类似:

CountDownLatch latch = new CountDownLatch(applicationInfoList.size);
            for (ApplicationInfo info : applicationInfoList) {
                service.execute(new MyTask(info, latch));
            }
            latch.await();

当你的工作完成后, MyTask应该调用latch.countDown()

latch.await()抛出InterruptedException所以它应该被处理。

注意:无论如何,它会阻塞您当前所在的线程。 最简单的方法是将此逻辑迁移到 Runnable 并提供回调:

class YourButchTask implements Runnable {
            
            private WorkDoneCallback callback;

            public YourButchTask(WorkDoneCallback callback) {
                this.callback = callback;
            }

            @Override
            public void run() {
                CountDownLatch latch = new CountDownLatch(applicationInfoList.size);
                for (ApplicationInfo info : applicationInfoList) {
                    service.execute(new MyTask(info, latch));
                }
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //handle it
                }
                callback.workWasDone();
            }
        }

之后,您可以将任务提交给您的service 注意:您的回调将从执行线程调用,因此您不能从它访问 UI。

这是一个不错的简单教程,希望对您有所帮助。

更新:

需要明确的是 - Callback是您的自定义界面,当工作完成时会通知您。 Go 提前使用SAM,例如:

interface WorkDoneCallback{
    void workWasDone();
}

PS要重定向主线程上的调用,只需在后台使用带有mainLooperHandlerrunOnUiThread()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM