[英]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.