AsyncTask 执行()或 executeOnExecutor()?

Posted

技术标签:

【中文标题】AsyncTask 执行()或 executeOnExecutor()?【英文标题】:AsyncTask execute() or executeOnExecutor()? 【发布时间】:2015-07-08 08:59:03 【问题描述】:

使用execute()executeOnExecuter() 有什么区别?

execute()默认如何执行任务? (串行还是并行?)

新的 SDK >16 应该使用什么?

将并行执行 (THREAD_POOL_EXECUTOR) 用于任务而不是串行执行是否是一种好习惯,即使这对应用程序无关紧要,或者这取决于将要执行的 AsyncTasks 的数量执行了吗?

【问题讨论】:

Ice Cream Sandwich 目标之后,AsyncTask 的 API 默认禁用并行执行。因此,如果您仍希望在 AsyncTasks 中并行执行,则需要使用 executeOnExecutor 【参考方案1】:

.execute() - 此函数将任务安排在单个后台线程的队列中。表示如果你调用两个 AsyncTask 并使用 .execute() 方法调用它们,它们将在队列中执行(先执行后第二)。

.executeOnExecutor() - 如果你想并行执行两个AsyncTask,你可以使用这个方法来执行AsyncTask。意味着两个 asyncTask 将同时执行。

简单来说:.execute() 方法创建一个单独的线程来执行 asyncTask,而 .executeOnExecuter() 方法为每个 ayncTask 创建单独的线程。

.execute 默认按顺序执行任务。

已编辑: 如果你想使用 executeOnExecutor() 你可以使用这个代码:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 else
     task.execute();

在 HONEYCOMB execute() 方法之前并行运行 AsynkTask。

【讨论】:

【参考方案2】:

.execute 默认如何执行任务(串行或并行)。

在 API 级别 11 之前:并行。

API 级别 11 及以上:串行。

应该用于 >16 的新 SDK(executeOnExecuter ?)

取决于您的要求。如果您对默认执行程序感到满意,请使用execute()。如果不是,请使用显式执行程序。

将并行执行 (THREAD_POOL_EXECUTOR) 用于任务而不是串行执行是否是一种好习惯,即使这对应用程序无关紧要,或者这取决于将要执行的异步任务的数量?

异步任务只能用于相对较短的后台操作。引用AsyncTask 文档:

AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 提供的各种 API Executor、ThreadPoolExecutor、FutureTask等包。

当异步任务运行时,执行线程无法执行其他任务。在只有一个执行器线程的串行执行器上,当您的任务运行时间过长时,更容易检测到问题。在并行执行器上检测此类问题需要同时执行更多长时间运行的任务。

因此,如果您真的需要切换到并行执行器,最好重新审视您的设计。

【讨论】:

以上是关于AsyncTask 执行()或 executeOnExecutor()?的主要内容,如果未能解决你的问题,请参考以下文章

在 AsyncTask 或 Service 上下载文件?

使用 AsyncTask 根据值定义文本颜色

Android 中AsyncTask后台线程的理解

AsyncTask原理

Android - 为 AsyncTask 设置超时?

AsyncTask - 等待其他 Asynctask 的执行