解决Android中AsyncTask的多线程阻塞问题,android 3.0以后AsyncTask的execute()方法发生了改变
前沿:最近工作的时候发现程序中有一个特别严重的问题,因为我们app中有一个需求是如果本地没有缓存则请求网络上的数据,如果本地有缓存先加载本地上的数据再异步去请求网络上的数据再更新界面
我们app应用有许多AsyncTask的网络操作,当我用WIFI操作的时候还没发现问题,加载本地缓存和加载网络上的数据都很快,没有出现问题,当我用2G网络的时候加载本地缓存都很慢
用WIFI的时候加载缓存中的数据1s钟都不需要,用2G网络的时候加载缓存数据的时候很慢要将近3s钟才能出来,后来我自己定义了一个Thread线程而没有使用AsyncTask去加载本地上的数据的时候WIFI和2G网络状态下的时间很接近一致差不多都是少于1s左右,我就发现了这个AsyncTask的使用有点问题,我是用的AsyncTask execute()方法,后来网络上查找发现
google在3.0以后的版本中做了修改,将asyncTask.execute(task);修改为了顺序执行,即只有当一个的实例的任务完成后在执行下一个实例的任务。后来在android 3.0后新增了一个方法executeOnExecutor(Executor exec, Object... params),该方法接受2个参数,第一个是Executor,第二个是任务参数。
第一个是线程池实例,google为我们预定义了两种:第一种是AsyncTask.SERIAL_EXECUTOR,第二种是AsyncTask.THREAD_POOL_EXECUTOR,顾名思义,第一种其实就像3.0以后的execute方法,是顺序执行的。第二种就是3.0以前的execute方法,是可以并发执行的。我们直接用asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, task);就可以多任务并发执行了。
如果你的应用使用android AsyncTask不管就android sdk的版本都需要并发运行
只需要加一个判断即可
我自己是定义了一个基类的AsyncTask来继承系统的AsyncTask,然后修改执行execute方法为新的executeNew方法