ImageLoaderConfiguration类
这个类主要说一下build()方法里面的initEmptyFiledsWithDefaultValues()方法
这里面主要确定了两件事
1.线程池中的队列用的是QueueProcessingType中的先进先出FIFO还是后进先出LIFO见DefaultConfigurationFactory
/**
* 创建线程池
*
* @param @param threadPoolSize 线程池大小
* @param @param threadPriority 线程优先级
* @param @param tasksProcessingType 图片下载和显示的工作队列排序
* @param @return
* @return Executor
*/
public static Executor createExecutor(int threadPoolSize,
int threadPriority, QueueProcessingType tasksProcessingType) {
boolean lifo = tasksProcessingType == QueueProcessingType.LIFO;// 后进先出法
BlockingQueue<Runnable> taskQueue = lifo ? new LIFOLinkedBlockingDeque<Runnable>()
: new LinkedBlockingQueue<Runnable>();
// 线程池维护线程的最少数量
// 线程池维护线程的最大数量
// 线程池维护线程所允许的空闲时间
// 线程池维护线程所允许的空闲时间的单位
// 线程池所使用的缓冲队列
// 线程池对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()
return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L,
TimeUnit.MILLISECONDS, taskQueue,
createThreadFactory(threadPriority));
}
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
另外就是暂停线程用到了AtomicBoolean 它的好处就是boolean值在变化的时候不允许这间插入保持操作的原子性
2.缓存用的是LRU(最少使用的页面置换算法)见LruMemoryCache
ImageLoader类
displayImage方法 相对简单没什么好说的