asyncTask 的execute和executeOnExecutor 方法
asyncTask.execute
Android.os.Build.VERSION_CODES.DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. After android.os.Build.VERSION_CODES.HONEYCOMB, it is planned to change this back to a single thread to avoid common application errors caused by parallel execution. If you truly want parallel execution, you can use the executeOnExecutor version of this method with THREAD_POOL_EXECUTOR; however, see commentary there for warnings on its use.
This method must be invoked on the UI thread.必须UI线程中调用
注意:这个函数让任务是以单线程队列方式或线程池队列方式运行,依赖于平台版本而有所不同。asyncTask首次引入时,这个函数会让任务以后台单线程串行方式执行。从android.os.Build.VERSION_CODES.DONUT(android 1.6)开始,它让允许任务在线程池中多任务并行执行。但在 android.os.Build.VERSION_CODES.HONEYCOMB(android 3.0)之后,它又该回去了,变成了单线程执行的模式,原因是多线程并行执行容易引发问题。如果你真想并行执行任务,你可以使用另外一个版本:使用THREAD_POOL_EXECUTOR参数的executeOnExecutor方法,但要注意使用警告提示
anyncTask.executeOnExecutor
This method is typically
used with THREAD_POOL_EXECUTOR to allow multiple tasks to run in
parallel on a pool of threads managed by AsyncTask, however you can also
use your own Executor for custom behavior.
Warning: Allowing multiple tasks to run in parallel from a thread pool
is generally not what one wants, because the order of their operation is
not defined. For example, if these tasks are used to modify any state
in common (such as writing a file due to a
button click), there are no guarantees on the order of the
modifications. Without careful work it is possible in rare cases for the
newer version of the data to be over-written by an older one, leading
to obscure data loss and stability issues. Such changes
are best executed in serial; to guarantee such work is serialized
regardless of platform version you can use this function with
SERIAL_EXECUTOR.
This method must be invoked on the UI thread.
Parameters:
exec The executor to use. THREAD_POOL_EXECUTOR is available as a
convenient process-wide thread pool for tasks that are loosely coupled.
这个方法通常和THREAD_POOL_EXECUTOR一起使用,允许多个任务在由AsyncTask管理的线程池中并行执行,但是您你也可以使用自定义行为的Executor。
警告:因为执行操作顺序并未定义,通常情况下,允许多个任务在线程池中并行执行,其结果并非是你想要的。例如:这些任务都要去修改某个状态值(诸如点击按钮写文件),因为没有确定的修改顺序,旧的修改可能会覆盖新修改的版本内容,导致不稳定数据丢失而变成一个稳定的问题。因此这种任务最好是串行执行;确保这些任务串行执行而不依赖于平台版本的方法是,使用SERIAL_EXECUTOR
看了这篇文章,http://blog.csdn.net/hitlion2008/article/details/7983449, 讲的挺好
更多解释:http://blog.csdn.net/guolin_blog/article/details/11711405
http://www.cnblogs.com/fotransit/archive/2013/04/17/3025937.html
作者: 一点点征服
出处:http://www.cnblogs.com/ldq2016/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利