最近我參加了一個採訪,其中有人問我一個問題:一個班級可以使用多少個asynctask?通過使用execute方法,您將通過調用asynctask來使用。所以,在一個班級中最大限度的asynctask是我所面臨的問題。可以在類android中使用多少個異步任務?
這是什麼答案?有人可以解釋多少,爲什麼?
最近我參加了一個採訪,其中有人問我一個問題:一個班級可以使用多少個asynctask?通過使用execute方法,您將通過調用asynctask來使用。所以,在一個班級中最大限度的asynctask是我所面臨的問題。可以在類android中使用多少個異步任務?
這是什麼答案?有人可以解釋多少,爲什麼?
這個問題本身沒有任何意義。如果有任何限制,您可以在課堂上儘可能多地使用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。
它可以幫助:http://stackoverflow.com/questions/9593850/is-there-a-limit-of-asynctasks-to-be-executed-at-the-same-time – 2014-09-27 14:06:25
此外http:///stackoverflow.com/questions/9654148/android-asynctask-threads-limits – 2014-09-27 14:07:07
和更多: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