在我的第一个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概念和线程有任何误解,请纠正我。
感谢。
答案 0 :(得分:1)
在Android中,阻止主线程气馁。系统将告诉用户该应用程序没有响应。但是,你可以通知&#34;后台线程完成其工作的主线程。一旦主线程知道这一点,它就会做一些事情。它在Android中很常见,它是AsyncTask for。
但是,AsyncTask
用于简单的一个线程。在您的情况下,解决方案之一是合并ExecutorService
和AsyncTask
。在您doInBackground
实例的AsyncTask
方法中,像往常一样使用ExecutorService
,并等待其shutdown(); awaitTermination()
或invokeAll()
完成。有关如何等待ExecutorService
完成的详细信息,请阅读this question/answer。
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
(然后再来),或者有来电等。如果您不处理此活动生命周期小心,它是如此&#34;危险&#34;,AsyncTask
无法解决这个问题。
长时间运行的任务应该在Service
中运行。请注意,Service
也在主线程中运行,因此方法是相同的,除非您使用IntentService
。在IntentService
的情况下,只需执行doInBackground
方法中的所有线程(以前在onHandleIntent
中)并在那里等待,在工作线程上调用此方法。
与Service
通信Activity
并在其生命周期内保持Activity
州的一致性是一个漫长的故事。您最好阅读&#34;完整专注的文档&#34;一杯咖啡:D。这可能会有所帮助: