可以在类android中使用多少异步任务?

时间:2014-09-27 13:59:29

标签: android performance android-activity asynchronous

最近我参加了一次采访,其中我被问到一个问题:课堂上可以使用多少个asynctask?通过使用execute方法,您将通过调用asynctask来使用。因此,类中asynctask的最大限制是向我提出的问题。

这是什么答案?有人可以解释一下有多少以及为什么?

1 个答案:

答案 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