2012-10-12 67 views
1

我想啓動兩個異步任務,但第二個將不會啓動,直到第一個完成。嘗試啓動兩個異步任務的問題。

從我GOOGLE了,人們通常認爲這種方法:

new MyAsyncTask().execute(params); 
new MyAsyncTask().execute(params); 

不過,我需要單獨實例化他們,同時也保持了任務的的句柄(通過例如消息)。因此,我有點做到這一點:

onStart() 
{ 
    taskA = new MyAsyncTask(paramsA); 
    taskB = new MyAsyncTask(paramsB); 
} 

onButtonPress() 
{ 
    taskA.execute(); 
    taskB.execute(); 
} 

編輯: 我注意到,taskB實際上並沒有開始執行任務A完成,直到(這所以它需要較長的時間運行的TCP/IP服務器)。我無法弄清楚爲什麼。任何想法或意見?

回答

2

簡短的回答是,根據您的Android版本,所有AsyncTask子類可能使用相同的線程,因此一次只能執行一個。這種情況有解決方法有兩種:

  1. 使用Runnable代替AsyncTask
  2. executeOnExecutor(Executor.THREAD_POOL_EXECUTOR, params)

更換一次調用execute顯然,嘗試#2第一 - 這是少了代碼的變化。但是,如果這不能很快地工作,我會切換到#1。在這種情況下,您不必擔心Android將來如何改變。

如果您想了解AsyncTask的線程模型的更多詳細信息,請查看Android doc entry

+0

感謝您的回答。我嘗試了#2,但'Executor.THREAD_POOL_EXECUTOR'由於某種原因不會通過編譯。明天左右我會看看#1。任何人都有一個關於良好Runnable示例的建議? – barnie82

+0

是的,問題是'executeOnExecutor'是3.0+,所以我不認爲有一種方法來使用'AsyncTask'並且它是版本獨立的。我最終爲我的代碼使用了'Runnable'。唯一真正的技巧就是將結果返回到UI線程。在我的情況下,我將工作線程的對象傳遞給一個'Handler'。然後當工作線程完成時(或者想要更新進度),它可以調用'Handler.post()'。我不確定是否有更好的方法來解決這個問題,但至少它是有效的。 –

+0

#1就像一個魅力:)感謝噸託德! – barnie82