说实话,我确实不怎么使用AsyncTask,一直都是Thread+Handler方式来进行异步通信的,
今天看到这个东西了,就留下做个存档,准备把与ui相关的操作采用AsyncTask做异步.
关于api10(2.3)默认可以同时执行5条线程,然而api10以后(3.0+)做了限制,同时执行1条线程,其余按添加顺序依次执行,这样就可能导致数据加载非常缓慢.
当然关闭一扇门的时候必然会打开一扇窗,之前AsyncTask的私有变量也随之开放.
一些修改参数
/** * 下面两种任务执行效果都一样,形变质不变 * */ // task.execute(); // task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); /** * 下面的方式在小于API 11级时效果是一样的,但在高版本中的稍微有点不同,可以看以下AsyncTask核心变量的定义就知道了使用如下 * 方式时,系统会默认的采用五个一组,五个一组的方式来执行我们的任务,定义在:AsyncTask.class中,private static final int CORE_POOL_SIZE = 5; * */ // use AsyncTask#THREAD_POOL_EXECUTOR is the same to older version #execute() (less than API 11) // but different from newer version of #execute() // task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); /** * 一个一个执行我们的任务,效果与按顺序执行是一样的(AsyncTask.SERIAL_EXECUTOR) * */ // task.executeOnExecutor(singleTaskExecutor); /** * 按我们指定的个数来执行任务的线程池 * */ // task.executeOnExecutor(limitedTaskExecutor); /** * 不限定指定个数的线程池,也就是说:你往里面放了几个任务,他全部同一时间开始执行, 不管你手机受得了受不了 * */ task.executeOnExecutor(allTaskExecutor); /** * 创建一个可在指定时间里执行任务的线程池,亦可重复执行 * */ // task.executeOnExecutor(scheduledTaskExecutor); /** * 创建一个按指定工厂模式来执行任务的线程池,可能比较正规,但也不常用 */ // task.executeOnExecutor(scheduledTaskFactoryExecutor);
可以写一个方法来统一修改
public static <Params, Progress, Result> void executeAsyncTask(AsyncTask<Params, Progress, Result> task, Params... params) { if (Build.VERSION.SDK_INT >= 11) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); } else { task.execute(params); } }