在做三级缓存的时候,显示图片的实现,都会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的源码如下
也就是说,AsynTask好用是好用,但是,一旦线程太多,就会挂掉;
简单分析一下AsynTask的优缺点
* AsyncTask的优缺点:
* 优点
* 安卓中 主线程不能进行耗时操作,子线程不能更改ui, 系统提供了此框架,可以简单快速的实现异步操作 使用方便
*
* 缺点
* 1 如果任务过多 会挂掉 128 + 核心数 *2 +1
* 2 旧版 <API19的最大线程数量 128,cpu资源会过多的消耗在线程切换上
* 3 优先任务不能得到优先执行,会排队
针对这个缺点的解决办法
源码中是使用的默认的执行器,那么解决的办法就是单独去指定执行器不使用默认的
使用executeOnExecutor 单独指定执行器,不使用默认的执行器