AsyncTask execute()或executeOnExecutor()?

问题描述 投票:42回答:2

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

  • execute()默认如何执行任务? (串行还是并联?)
  • 什么应该用于新的SDK> 16?
  • 将并行执行(THREAD_POOL_EXECUTOR)用于任务而不是串行是一个好的做法,即使它对应用程序无关紧要,还是取决于将要执行的AsyncTasks的数量?
android android-asynctask
2个回答
41
投票

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

在API级别11之前:并行。

API级别11及以上:序列号。

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

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

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

异步任务应仅用于相对短的背景操作。引用AsyncTask文档:

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

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

因此,如果您确实需要切换到并行执行程序,那么最好重新访问您的设计。


75
投票

.execute() - 此函数为单个后台线程调度队列上的任务。意味着如果您正在调用两个AsyncTasks并使用.execute()方法来调用它们,它们将在队列中执行(第一个然后是第二个)。

.executeOnExecutor() - 如果要并行执行两个AsyncTasks,可以使用此方法执行AsyncTask。意味着asyncTasks将同时执行。

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.