AsyncTask 执行()或 executeOnExecutor()?
Posted
技术标签:
【中文标题】AsyncTask 执行()或 executeOnExecutor()?【英文标题】:AsyncTask execute() or executeOnExecutor()? 【发布时间】:2015-07-08 08:59:03 【问题描述】:使用execute()
和executeOnExecuter()
有什么区别?
execute()
默认如何执行任务? (串行还是并行?)
新的 SDK >16 应该使用什么?
将并行执行 (THREAD_POOL_EXECUTOR
) 用于任务而不是串行执行是否是一种好习惯,即使这对应用程序无关紧要,或者这取决于将要执行的 AsyncTask
s 的数量执行了吗?
【问题讨论】:
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()?的主要内容,如果未能解决你的问题,请参考以下文章