Sha*_*dow 1 performance android asynchronous android-activity
最近我参加了一次采访,其中我被问到一个问题:课堂上可以使用多少个asynctask?通过使用execute方法,您将通过调用asynctask来使用.因此,类中asynctask的最大限制是向我提出的问题.
这是什么答案?有人可以解释一下,为什么?
问题本身没有任何意义.您可以根据需要AsyncTask在课堂中使用尽可能多的课程,如果有限制,那将是荒谬的.我认为他的意思是AsyncTask可以同时执行多少以及如何执行它们,答案就是:它取决于.
AsyncTasks可以串行或并行执行.默认行为取决于设备的API级别.该文件中execute()的AsyncTask说:
注意:此函数根据平台版本为单个后台线程或线程池调度队列上的任务.首次引入时,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);
Run Code Online (Sandbox Code Playgroud)
但是,即使您并行运行任务,也可以同时运行多少个限制.要找出该限制的位置,您必须查看AsyncTask的源代码.
直到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;
Run Code Online (Sandbox Code Playgroud)
但是,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;
Run Code Online (Sandbox Code Playgroud)
ThreadPoolExecutor两种情况下的实施情况保持不变:
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
Run Code Online (Sandbox Code Playgroud)
所以这几乎应该回答你的问题.但如果您真的想了解其AsyncTask工作原理,那么您应该自己研究源代码!此链接导致Android 4.4上的AsyncTask实现.