繁体   English   中英

Android中主线程和工作线程之间的通信

[英]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用于一个简单的线程。 在您的情况下,解决方案之一是将ExecutorServiceAsyncTask结合使用。 在您创建的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等待,在工作线程上调用此方法。

长期以来,将ServiceActivity通信并在Activity的整个生命周期内保持Activity状态的一致性。 最好喝一杯咖啡:D来“充分集中”阅读文档。 这可能会有所帮助:

暂无
暂无

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

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