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

Posted im大钊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于universal imageloader缓存你需要知道的秘密相关的知识,希望对你有一定的参考价值。

imageloader图片加载框架

摘要:

这是一篇关于阅读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既是一个链表结构,又是一个队列的结构。

以上是关于关于universal imageloader缓存你需要知道的秘密的主要内容,如果未能解决你的问题,请参考以下文章

Universal-imageLoader缓存图片加载

Android-Universal-ImageLoader

Image-Universal-Loader

Android 网络图片加载缓存处理库ImageLoader和Picasso

ImageLoader作用 AAAA

从设计到实现,一步步教你实现Android-Universal-ImageLoader-辅助类