关于universal imageloader缓存你需要知道的秘密

2019-07-12 13:30 评论 0 条

摘要:

这是一篇关于阅读universal-imageloader缓存源码的文章,缓存分为内存和本地,内存缓存提供:先进先出缓存策略最大对像缓存策略使用频率缓存策略Lru算法缓存策略周期存活缓存策略弱引用缓存策略“相等”替换缓存策略;本地缓存提供:Lru算法缓存策略。源码里面,还涉及到数据结构、线程池和数据流操作的知识,加深了大钊对基础知识的理解。

内存缓存

先进先出缓存策略

先进先出策略,使用的是双向队列LinkedList,每次删除队列中的第一个元素,为了保证多线程环境下的安全,使用了Collections.synchronizedList()工具类。

在源码中,需要注意LinkedList既是一个链表,也是一个队列,它实现了ListDeque接口。

private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>());

最大对象缓存策略

最大对象策略,将占据内存最大的对象删除,所以该策略需要另外一个HashMap记录每一个Bitmap占据内存的大小,同理为了保证线程环境下的安全,使用了Collections.synchronizedMap()工具类。

在源码中,需要注意除了有Collections.synchronizedList()Collections.synchronizedMap(),还有Collections.synchronizedSet(),解决了在多线程环境下ListMapSet集合的安全问题。

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源码熟悉了内存缓存、本地缓存的策略,使用HashMapLinkedListLinkedHashMap等常用集合存储数据,使用策略模式定制多种缓存规则,使用ThreadPoolExecutor操作本地缓存的写入、读取、删除等操作,LinkedList既是一个链表结构,又是一个队列的结构。

当前文章价值8.48元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/2746.html ,谢谢支持!

资源分享

浅谈Layout类 浅谈Layout类
带www和不带www域名与网站收录量、权重关系 带www和不带www域名与网站收录量
AsyncTask==Handler+Thread对比使用说明 AsyncTask==Handler+Thread对
Android开发之drawable文件夹下的各种XML标签的用法总结 Android开发之drawable文件夹下

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情