![](/img/trans.png)
[英]How to wait for downloading thread to finish and then return without blocking UI thread?
[英]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要重定向主线程上的调用,只需在后台使用带有mainLooper
的Handler
或runOnUiThread()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.