三级缓存之AsyncTask学习

来源:互联网 发布:仿淘宝手机网站模板 编辑:程序博客网 时间:2024/06/05 23:59

在做三级缓存的时候,显示图片的实现,都会post一个runnable,如果数据较多的情况下,会开销大量的线程,这样就会造成加载的卡断;

所以需要对线程的优化,在Android上面对线程池有一个轻量级的封装——AsyncTask;

AsyncTask的源码其实也就是对java线程池ThreadPoolExecutor 的一个封装


学习理解一下ThreadPoolExecutor 的使用

//ThreadPoolExecutor executor = new ThreadPoolExecutor(
//corePoolSize,   核心线程数量 -- 正式员工
//maximumPoolSize,最大 线程数量 -- 最大 - 正式 =  临时工
//keepAliveTime, unit, 如果临时工空闲了,过多久开除
//workQueue 等待被执行的任务
//);
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new  LinkedBlockingQueue<Runnable>(3));


简单看一下AsynTask的源码如下

177
public abstract class AsyncTask<Params, Progress, Result> {
178
    private static final String LOG_TAG = "AsyncTask";
179
180
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
181
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
182
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
183
    private static final int KEEP_ALIVE = 1;
184
185
    private static final ThreadFactory sThreadFactory = new ThreadFactory() {
186
        private final AtomicInteger mCount = new AtomicInteger(1);
187
188
        public Thread newThread(Runnable r) {
189
            return new Thread(r"AsyncTask #" + mCount.getAndIncrement());
190
        }
191
    };
192
193
    private static final BlockingQueue<Runnable> sPoolWorkQueue =
194
            new LinkedBlockingQueue<Runnable>(128);
很容易就知道最大的线程个数是128 + CPU-COUNT * 2 + 1


也就是说,AsynTask好用是好用,但是,一旦线程太多,就会挂掉;

 

 简单分析一下AsynTask的优缺点


 *   AsyncTask的优缺点:
 *   优点
 *   安卓中 主线程不能进行耗时操作,子线程不能更改ui, 系统提供了此框架,可以简单快速的实现异步操作 使用方便
 *   
 *   缺点
 *   1 如果任务过多 会挂掉  128 +  核心数 *2 +1 
 *   2 旧版 <API19的最大线程数量 128,cpu资源会过多的消耗在线程切换上
 *   3 优先任务不能得到优先执行,会排队


针对这个缺点的解决办法

602
603
    public static void execute(Runnable runnable) {
604
        sDefaultExecutor.execute(runnable);
605
    }

源码中是使用的默认的执行器,那么解决的办法就是单独去指定执行器不使用默认的

使用executeOnExecutor 单独指定执行器,不使用默认的执行器


原创粉丝点击