Android-Universal-Image-Loader(UIL)源码解析(二)

来源:互联网 发布:java实例变量 编辑:程序博客网 时间:2024/06/07 05:23

当应用打算从网络请求一张图片时,我们期待程序首先从内存中去获取,如果内存中没有那就从存储设备中去获取,如果存储设备中也没有,那就从网络下载这张图片。所以本节我们学习如何在内存中缓存图片。UIL内存缓存的类结构图:

  •        

        

1.作为一个缓存工具类,首先其应该具有如下功能:

  

 2.其次,要考虑数据的存储方式和LRUD实现(UIL使用一个Map以弱引用的方式存储外界的缓存对象)


3.既然是内存缓存,我们就需要考虑缓存总容量,这里用图片的强应用计算他的大小


至此,一个内存缓存工具类的要素都已指出。下面我们来观察具体的实现。

前面我们说,缓存的总用量是有限的,那么就需要考虑当缓存满时,先淘汰那些对象,这就涉及缓存策略的问题了。

UIL提供了各种策略缓存类


FIFO


最大位图

LRU 利用了LinkedHashMap的访问特性
Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助记录entry加入的前后顺序或者记录entry被访问的频率(最少被访问的entry靠前,最近访问的entry靠后)。大致的过程如下:

new LinkedHashMap(10, 0.75, true);
其中前面两个参数就是HashMap构造函数需要的参数,后面的true表明LinkedHashMap按照访问的次序来排序
按照访问的次序来排序的含义:当调用LinkedHashMap的get(key)或者put(key, value)时,碰巧key在map中被包含,那么LinkedHashMap会将key对象的entry放在线性结构的最后。
按照插入顺序来排序的含义:调用get(key), 或者put(key, value)并不会对线性结构产生任何的影响。

   


指定缓存时长策略

指定比较器

参考资料:
http://blog.csdn.net/hsuxu/article/details/7454212
http://blog.csdn.net/chunqiuwei/article/details/37662565
源码下载:

0 0