使用execute()
和executeOnExecuter()
之间的区别是什么?
默认情况下execute()
如何执行任务? (串行或并行?)
新SDK应该使用什么> 16?
将并行执行(THREAD_POOL_EXECUTOR
)用于任务而不是串行是一个好习惯,即使它对应用程序无关紧要,还是取决于AsyncTask
的数量那将被执行的?
答案 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。
当异步任务正在运行时,执行程序线程无法执行其他任务。在只有一个执行程序线程的串行执行程序上,当您的任务运行时间过长时,更容易检测到问题。在并行执行器上检测此类问题需要同时执行更长时间的任务。
因此,如果您真的需要切换到并行执行程序,那么最好重新审视您的设计。