[英]Communication between main thread and worker threads in android
在我的第一个android项目中,我进行了一些数据操作,因此我使用了多线程方法。
在MainActivity中,我创建了多个Runnable对象,并使用ExecutorService运行所有线程。 据我了解,所有线程都放在消息队列中并依次执行。 并且由于主线程已经在队列中,因此它将在启动其他线程之前执行。 有什么方法可以使主线程等待其他线程完成然后继续?
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//call MyFunction here
}
private List<Pair[]> myFunction(int dataInput) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(12);
MyTask MyTask = new MyTask();
for (int i = 0; i < gallerySize; ++i) {
final int index = i;
Runnable runnable = MyTask.runLongOperationWithThread(new MyTask.DataCallback(){
@Override
public void onSuccess(double[] scores) {
// get data back to main thread
}
@Override
public void onError(Exception ex) {
//TODO: log this error out to file
}
});
executorService.execute(runnable);
}
// try to get back all data from multi threading and do some operations
return returnList;
}
Looper和Handler在这种情况下有帮助吗?
如果我对android概念和线程有任何误解,请纠正我。
谢谢。
在Android中, 不建议停止主线程。 系统将告知用户该应用没有响应。 但是,您可以“通知”主线程后台线程已完成其工作。 一旦主线程知道了这一点,它将执行某些操作。 在Android中很常见,这正是AsyncTask的目的。
但是, AsyncTask
用于一个简单的线程。 在您的情况下,解决方案之一是将ExecutorService
和AsyncTask
结合使用。 在您创建的AsyncTask
实例的doInBackground
方法中,像往常一样使用ExecutorService
,然后通过shutdown(); awaitTermination()
等待它完成shutdown(); awaitTermination()
shutdown(); awaitTermination()
或invokeAll()
。 阅读此问题/答案以获取有关如何等待ExecutorService
完成的更多信息。
private class WrappingTask extends AsyncTask<Void, Void, Exception> {
protected Exception doInBackground(Void... args) {
ExecutorService taskExecutor = Executors.newFixedThreadPool(12);
for (. . .) {
taskExecutor.execute(new MyTask(. . .));
}
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
. . .
return e;
}
return null;
}
protected void onPostExecute(Exception error) {
// Notify the user that the task has finished or do anything else
// and handle error
}
}
如果任务长期运行
AsyncTask
是一个方便的类,可以简化线程和与主线程的通信。 长时间运行的任务的问题是用户可以离开Activity
(然后再次出现),或者有来电等。如果您不小心处理此活动生命周期 ,那么它“危险”, AsyncTask
不处理这个。
长期运行的任务应在Service
运行。 请注意, Service
也在主线程中运行,因此除非您使用IntentService
,否则方法将相同。 如果是IntentService
,只需在onHandleIntent
方法中执行所有线程(以前在doInBackground
),然后在onHandleIntent
等待,在工作线程上调用此方法。
长期以来,将Service
与Activity
通信并在Activity
的整个生命周期内保持Activity
状态的一致性。 最好喝一杯咖啡:D来“充分集中”阅读文档。 这可能会有所帮助:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.