AsyncTask execute() or executeOnExecutor()?

62

execute()executeOnExecutor()有什么区别?

  • execute()默认以什么方式执行任务?(串行或并行?)

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

  • 在任务数量不重要的情况下,使用并行执行(THREAD_POOL_EXECUTOR)比串行执行好吗?或者这取决于将要执行的 AsyncTask 的数量?


在冰淇淋三明治 (Ice Cream Sandwich) 版本之后,AsyncTask API 默认禁用了并行执行。因此,如果你仍希望在你的 AsyncTasks 中实现并行执行,你需要使用 executeOnExecutor - IgorGanapolsky
2个回答

97

.execute() - 此函数会将任务调度到单个后台线程的队列中。这意味着,如果您调用了两个AsyncTask并使用.execute()方法来调用它们,则它们将按顺序排队执行(先执行第一个,然后执行第二个)。

.executeOnExecutor() - 如果您希望同时执行这两个AsyncTask,可以使用此方法来执行AsyncTask。这样两个asyncTasks将同时执行。

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

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

编辑:如果您想使用executeOnExecutor(),可以使用以下代码:

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

在HONEYCOMB之前,execute()方法会以并行方式运行AsynkTask。


56
.execute 默认是串行还是并行执行任务?
API 11 以下版本为并行。
API 11 及以上版本为串行。
新的 SDK > 16 应该使用什么(executeOnExecuter)?
取决于您的需求。如果您满意默认的 executor,请使用 execute()。如果不满意,就使用显式的 executor。
在应用程序中,使用并行执行(THREAD_POOL_EXECUTOR)代替串行执行是否是一个好习惯,即使对应用程序没有影响,还是取决于将要执行的异步任务的数量?
异步任务只应用于相对短暂的后台操作。引用 AsyncTask 文档:
"AsyncTasks 应该理想情况下用于短时间操作(最多几秒钟)。如果需要长时间运行线程,则强烈建议使用 java.util.concurrent 包提供的各种 API,例如 Executor、ThreadPoolExecutor 和 FutureTask。"
当异步任务正在运行时,executor 线程无法执行其他任务。在具有单个 executor 线程的串行 executor 上,当任务运行时间过长时,更容易检测出问题。在并行 executor 上检测此类问题需要更多的同时长时间运行的任务。
因此,如果您确实需要切换到并行 executor,则最好重新审视设计。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接