android

时间:2016-06-12 01:00:03

标签: android multithreading executorservice

在我的第一个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概念和线程有任何误解,请纠正我。

感谢。

1 个答案:

答案 0 :(得分:1)

在Android中,阻止主线程气馁。系统将告诉用户该应用程序没有响应。但是,你可以通知&#34;后台线程完成其工作的主线程。一旦主线程知道这一点,它就会做一些事情。它在Android中很常见,它是AsyncTask for。

但是,AsyncTask用于简单的一个线程。在您的情况下,解决方案之一是合并ExecutorServiceAsyncTask。在您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(然后再来),或者有来电等。如果您不处理此活动生命周期AsyncTask无法解决这个问题。

长时间运行的任务应该在Service中运行。请注意,Service也在主线程中运行,因此方法是相同的,除非您使用IntentService。在IntentService的情况下,只需执行doInBackground方法中的所有线程(以前在onHandleIntent中)并在那里等待,在工作线程上调用此方法。

Service通信Activity并在其生命周期内保持Activity州的一致性是一个漫长的故事。您最好阅读&#34;完整专注的文档&#34;一杯咖啡:D。这可能会有所帮助: