【问题标题】:How many async task can be used in a class android?一个类android可以使用多少个异步任务?
【发布时间】:2014-09-27 13:59:29
【问题描述】:

最近我参加了一个面试,有人问我一个问题:一个班级可以使用多少个异步任务?通过使用执行方法,您将通过调用 asynctask 来使用。所以类中异步任务的最大限制是向我提出的问题。

这个问题的答案是什么?谁能解释一下有多少以及为什么?

【问题讨论】:

标签: android performance android-activity asynchronous


【解决方案1】:

这个问题本身没有任何意义。你可以在一个类中使用任意数量的AsyncTask,如果有限制的话,那就太荒谬了。我猜他的意思是可以同时执行多少个AsyncTask,以及它们是如何执行的,答案是:视情况而定。

AsyncTasks 可以串行或并行执行。默认行为取决于设备的 API 级别。 AsyncTaskexecute()documentation 说:

注意:此函数将任务安排在一个队列中 取决于平台的后台线程或线程池 版本。首次引入时,AsyncTask 是在一个 单个后台线程。从 DONUT 开始,这已更改为 允许多个任务并行运行的线程池。 启动 HONEYCOMB,任务恢复为单机执行 线程避免由并行引起的常见应用程序错误 执行。如果你真的想要并行执行,你可以使用 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 (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 的工作原理,那么您应该自己研究源代码! This link leads to the AsyncTask implementation on Android 4.4.

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多