2014-09-27 47 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