关于universal imageloader缓存你需要知道的秘密
Posted im大钊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于universal imageloader缓存你需要知道的秘密相关的知识,希望对你有一定的参考价值。
imageloader图片加载框架
摘要:
这是一篇关于阅读universal-imageloader
缓存源码的文章,缓存分为内存和本地,内存缓存提供:先进先出缓存策略、最大对像缓存策略、使用频率缓存策略、Lru算法缓存策略、周期存活缓存策略、弱引用缓存策略和*“相等”替换缓存策略*;本地缓存提供:Lru算法缓存策略。源码里面,还涉及到数据结构、线程池和数据流操作的知识,加深了大钊对基础知识的理解。
先进先出缓存策略
先进先出策略,使用的是双向队列LinkedList
,每次删除队列中的第一个元素,为了保证多线程环境下的安全,使用了Collections.synchronizedList()
工具类。
在源码中,需要注意LinkedList
既是一个链表,也是一个队列,它实现了List
、Deque
接口。
private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>());
最大对象缓存策略
最大对象策略,将占据内存最大的对象删除,所以该策略需要另外一个HashMap
记录每一个Bitmap占据内存的大小,同理为了保证线程环境下的安全,使用了Collections.synchronizedMap()
工具类。
在源码中,需要注意除了有Collections.synchronizedList()
、Collections.synchronizedMap()
,还有Collections.synchronizedSet()
,解决了在多线程环境下List
、Map
和Set
集合的安全问题。
private final Map<Bitmap, Integer> valueSizes = Collections.synchronizedMap(new HashMap<Bitmap, Integer>());
LRU算法缓存策略
LRU算法,是常用的应用于内存缓存、本地缓存的策略算法,相关的工具类有android.util.LruCache
,它的核心思想:内部使用了一个LinkedHashMap
,它会对存储的元素根据访问的顺序排序,被访问的元素排在前面。
private final Map<String, Bitmap> lruCache = Collections.synchronizedMap(new LinkedHashMap<String, Bitmap>(INITIAL_CAPACITY, LOAD_FACTOR, true));
使用频率缓存策略
使用频率策略,Bitmap被调用一次加1,最终删除被调用次数最少的Bitmap。
private final Map<Bitmap, Integer> usingCounts = Collections.synchronizedMap(new HashMap<Bitmap, Integer>());
周期存活缓存策略
周期存活策略,指定存储的每个Bitmap对象存活的周期,删除超过存活周期的对象,保证旧的对象被删除并释放内存。
private final Map<String, Long> loadingDates = Collections.synchronizedMap(new HashMap<String, Long>());
“相等”替换缓存策略
存储新的Bitmap对象前,先检查内存是否存在URL地址相同的对象,存在先将该Bitmap删除,然后将新对象存储。
本地缓存策略(LRU算法)
本地策略,使用了LRU算法,将近期使用最少的元素删除。核心类是DiskLruCache
,里面实现了基本的操作,LruDiskCache
是一个适配器,负责将DiskLruCache
适配到接口DiskCache
。
本地缓存策略(固定存活时长)
存活时长策略,将记录文件修改的时间,然后保存本地,调用获取文件的方法先检查文件是否“超时”,“超时”的文件将会被删除。
总结:
通过universal-imageloader
源码熟悉了内存缓存、本地缓存的策略,使用HashMap
、LinkedList
、LinkedHashMap
等常用集合存储数据,使用策略模式定制多种缓存规则,使用ThreadPoolExecutor
操作本地缓存的写入、读取、删除等操作,LinkedList
既是一个链表结构,又是一个队列的结构。
以上是关于关于universal imageloader缓存你需要知道的秘密的主要内容,如果未能解决你的问题,请参考以下文章