簡體   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