最近我参加了一次采访,其中我被问到一个问题:课堂上可以使用多少个asynctask?通过使用execute方法,您将通过调用asynctask来使用。因此,类中asynctask的最大限制是向我提出的问题。
这是什么答案?有人可以解释一下有多少以及为什么?
答案 0 :(得分:8)
问题本身没有任何意义。您可以根据需要在课程中使用尽可能多的AsyncTask
,如果有限制,那将是荒谬的。我认为他意味着可以同时执行多少AsyncTask
以及如何执行它们,答案就是:它取决于。
AsyncTasks
可以串行或并行执行。默认行为取决于设备的API级别。 execute()
AsyncTask
的{{3}}说:
注意:此函数会在队列中为单个任务计划任务 后台线程或线程池取决于平台 版。首次引入时,AsyncTasks在a上串行执行 单背景线程。从DONUT开始,这被改为a 允许多个任务并行运行的线程池。 启动HONEYCOMB,任务将重新开始执行 线程,以避免并行引起的常见应用程序错误 执行。如果你真的想要并行执行,你可以使用 executeOnExecutor(Executor,Params ...)此方法的版本 THREAD_POOL_EXECUTOR;但是,请参阅那里的评论以获得警告 它的用途。
话虽如此,您可以选择是要并行执行还是按顺序执行它们:
// 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);
但是,即使您并行运行任务,也可以同时运行多少个限制。要找出该限制的位置,您必须查看documentation。
直到Android 4.3(Jelly Bean),限制被硬编码为这些值:
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
是如何工作的,那么你应该自己研究源代码! source code of AsyncTask