2014-09-27 44 views
1

最近我參加了一個採訪,其中有人問我一個問題:一個班級可以使用多少個asynctask?通過使用execute方法,您將通過調用asynctask來使用。所以,在一個班級中最大限度的asynctask是我所面臨的問題。可以在類android中使用多少個異步任務?

這是什麼答案?有人可以解釋多少,爲什麼?

+0

它可以幫助:http://stackoverflow.com/questions/9593850/is-there-a-limit-of-asynctasks-to-be-executed-at-the-same-time – 2014-09-27 14:06:25

+0

此外http:///stackoverflow.com/questions/9654148/android-asynctask-threads-limits – 2014-09-27 14:07:07

+0

和更多:http://stackoverflow.com/questions/4068984/running-multiple-asynctasks-at-the-same-time-not-possible& HTTP://計算器。COM /問題/ 9654148/Android系統的AsyncTask線程禁區 – 2014-09-27 14:08:10

回答

8

這個問題本身沒有任何意義。如果有任何限制,您可以在課堂上儘可能多地使用AsyncTask,這很荒謬。我認爲他的意思是可以同時執行多少個AsyncTask以及它們是如何執行的,並且答案是:這取決於。

AsyncTasks可以串行或並行執行。默認行爲取決於設備的API級別。的AsyncTask​​的documentation說:

注:此功能安排在隊列中的任務單 後臺線程或取決於平臺 版本的線程池。當第一次引入時,AsyncTasks在單個後臺線程上連續執行。從DONUT開始,這被改爲 線程池,允許多個任務並行操作。 啓動HONEYCOMB,任務將重新在單個線程上執行,以避免由執行並行 引起的常見應用程序錯誤。如果您確實需要並行執行,則可以使用 THREAD_POOL_EXECUTOR此方法的executeOnExecutor(Executor,Params ...)版本 ;不過,請參閱其中的註釋,其中使用 的警告。

說了這麼多,你可以選擇是否要在並聯或串聯像這樣來執行它們:即使你並行運行是有一定限度的任務

// Executes the task in parallel to other tasks 
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

// Adds the task to a queue and executes one at a time. 
asyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); 

但是多少能同時運行。要找出限制的位置,您必須查看source code of AsyncTask

直到的Android 4.3(果凍豆)的限制被硬編碼到這些值:

private static final int CORE_POOL_SIZE = 5; 
private static final int MAXIMUM_POOL_SIZE = 128; 
private static final int KEEP_ALIVE = 1; 

但與Android 4.4已改變並且計算的限制取決於在裝置中使用的處理器上:

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); 
private static final int CORE_POOL_SIZE = CPU_COUNT + 1; 
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; 
private static final int KEEP_ALIVE = 1; 

ThreadPoolExecutor的實現保持不變在兩種情況下:

public static final Executor THREAD_POOL_EXECUTOR 
     = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, 
       TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); 

因此,這應該幾乎回答你的問題。但是如果你真的想知道AsyncTask的工作方式,那麼你應該自己研究源代碼! This link leads to the AsyncTask implementation on Android 4.4