AsyncTask execute()或executeOnExecutor()?

时间:2015-04-29 07:53:58

标签: android android-asynctask

使用execute()executeOnExecuter()之间的区别是什么?

  • 默认情况下execute()如何执行任务? (串行或并行?)

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

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

2 个答案:

答案 0 :(得分:72)

.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()方法之前并行运行AsynkTask。

答案 1 :(得分:40)

  

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

在API级别11之前:并行。

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

  

应该用于新的SDK&gt; 16(executeOnExecuter?)

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

  

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

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

  

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

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

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