三级缓存之AsyncTask学习

在做三级缓存的时候,显示图片的实现,都会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 =  + 1;
182
    private static final int MAXIMUM_POOL_SIZE =  * 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 #" + .getAndIncrement());
190
        }
191
    };
192
 
193
    private static final BlockingQueue<RunnablesPoolWorkQueue =
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
        .execute(runnable);
605
    }

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值