说实话,我确实不怎么使用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);
                    }
            }

    

    

    

    参考链接:1/2/3/4