最近在项目中发现使用谷歌自带的AsyncTask 时,doInBackgroud不执行的情况,最初以为是AsyncTask的系统bug,后面查找资料后发现并不是这么回事,具体情况如下:
AsyncTask运行有两种模式,一种串行,一种是并行;
串行模式下当前App进程所有的Task任务一个个的执行,下一个任务必须等待上一个任务执行完后才会执行
并行模式下当前App进行所有的Task任务可以并发执行,两个任务之间没有上下关系
AsyncTask.execute() 方法在Android1.6 API 4之前是串行执行,在1.6 到 Android2.3 API 9之间是并行执行,在Android3.0 API 11 后又改回串行执行;
在Android3.0 API11 之后提供了一个新方法 AsyncTask.executeOnExecutor()实现并行执行
因此在代码中要能够兼容所有的版本的写法是:
if(Build.VERSION.SDK_INT >= Build.VERSION.CODES.HONEYCOMB){
myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}else{
myTask.execute();
}
注意:
1.executeOnExecutor 会检查targetSdkVersion , 果如小于或等于API 12 ,将会强制将串行任务改为并行任务,因此AsyncTask要运行并行模式在3.0 API11之后必须要知道targetSdkVersion
2.项目中尽量避免在AsyncTask.doInBackground中执行循环任务:如心跳之类的