在我的AsyncTask的某個點上,在完成了一些驗證之後,我需要從另一個線程產生一些其他工作。所以我現在需要兩個後臺線程,每個線程都是自己的(每個執行大約2-3秒)。這個想法是爲了最大限度地提高Atrix等雙核處理器的性能。從另一個AsyncTask調用一個AsyncTask
是否可以創建另一個asynctask &從第一個執行它?任何人都可以提出一個更好的方式來做到這一點
謝謝!
編輯:我想知道什麼publishProgress()從第二個任務甚至會做...因爲它不是從一個活動開始?
在我的AsyncTask的某個點上,在完成了一些驗證之後,我需要從另一個線程產生一些其他工作。所以我現在需要兩個後臺線程,每個線程都是自己的(每個執行大約2-3秒)。這個想法是爲了最大限度地提高Atrix等雙核處理器的性能。從另一個AsyncTask調用一個AsyncTask
是否可以創建另一個asynctask &從第一個執行它?任何人都可以提出一個更好的方式來做到這一點
謝謝!
編輯:我想知道什麼publishProgress()從第二個任務甚至會做...因爲它不是從一個活動開始?
是否可以接受創建另一個 的AsyncTask &從第一 一個執行呢?
是的,但只在onProgressUpdate()
或onPostExecute()
之內,因爲這些方法在UI線程上運行。因此,通過選擇上面列出的兩種方法之一,在UI線程上啓動第二個AsyncTask
。
我想知道什麼publishProgress() 從第二個任務,甚至會做...... 因爲它不是從 活動開始了嗎?
它完全一樣的東西,因爲你是從UI線程開始的。
AsyncTask對於在與主線程通信以處理UI更改時執行一些後臺工作很有用。看來,這不是你的情況。
此外,一個AsyncTask必須從主線程執行。從參考的AsyncTask:
有一些線程規則 必須遵循這一類 正常工作:
- 任務實例必須在UI線程上創建。
- execute(Params ...)必須在UI線程上調用。
您可以將看看這個article,看看哪種最適合您。
如果您正在尋找執行多個異步任務的機制,從3.0及以上版本開始,它支持一種名爲executeOnExecutor的方法,該方法允許您在由異步任務管理的線程池上並行調度任務。
+1信息。我正在開發的這個特定應用程序的目標是2.2和更高版本,所以不能在這裏使用,但很有必要知道未來。 – OceanBlue 2011-04-25 17:43:33
這可以使用消息傳遞併發和單個處理程序完成。的概念證明代碼如下:
private Handler myHandler= new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
case 0:
Toast.makeText(Main.this,"Message0", Toast.LENGTH_SHORT).show();
Thread thread= new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(3000);
}
catch(Exception e){}
myHandler.sendEmptyMessage(2);
}
});
thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits
thread.start();
break;
case 1:
Toast.makeText(Main.this,"Message1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(Main.this,"Message2", Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
break;
}
}
};
我發起了一個按鈕,點擊第一個線程,如:
ON CLICK HANDLER
threadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Thread thread= new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
}
catch(Exception e){
}
myHandler.sendEmptyMessage(0);
try {
Thread.sleep(3000);
}
catch(Exception e){
}
myHandler.sendEmptyMessage(1);
}
});
thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits
thread.start();
}
});
線程睡眠的調用是模仿一個時間密集型任務。
我想知道這是否比AsyncTask有什麼優勢,以及在哪種情況下選擇另一種? – 2012-11-30 17:31:42
Lanner:謝謝。這完美地解決了我的問題。 – OceanBlue 2011-04-25 17:48:23
'onPreExecute()'也在UI線程上運行呢? http://developer.android.com/reference/android/os/AsyncTask.html#onPreExecute%28%29 – 2014-12-21 19:36:47
@ ban-geoengineering onPreExecute()方法,顧名思義,將在所有其他方法之前執行但是,AsyncTask不管它是否也在UI線程中執行。基本上,如果您需要在doInBackground(...)開始之前每次執行一些計算或邏輯,則這是您的方法。 – tsukanomon 2015-06-02 13:11:20