详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)
来源:互联网 发布:花衣吹笛手 知乎 编辑:程序博客网 时间:2024/06/07 23:03
内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧。
内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache、FuzzyKeyMemoryCache、LargestLimitedMemoryCache、LimitedAgeMemoryCache、LRULimitedMemoryCache、LruMemoryCache、UsingFreqLimitedMemoryCache以及WeakMemoryCache。
Ok,首先我们学习LimitedMemoryCache这个类。LimitedMemoryCache是LimitedMemoryCache的子类,其成员变量如下:
private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>());由此可知内存缓存的数据结构是线程安全的队列。
分析其函数,我们知道队列的操作在这里也是可以得到对应的体现。只是创建软引用的方法还是可以观察一下。
@Overrideprotected Reference<Bitmap> createReference(Bitmap value) {return new WeakReference<Bitmap>(value);}接下来,需要分析的第二个类是FuzzyKeyMemoryCache,按照类的注释,这个类是框架内部使用的,它实现了MemoryCache这个接口。当前的类的成员变量如下:
private final MemoryCache cache;private final Comparator<String> keyComparator;
由MemoryCache这个成员变量并且是在当前的构造函数中初始化可知,这个类是个包装器,真正的功能是由cache实现的。
接下来我们要分析的类是LargestLimitedMemoryCache,这个类依旧是LimitedMemoryCache的子类,
其成员变量如下:
private final Map<Bitmap, Integer> valueSizes = Collections.synchronizedMap(new HashMap<Bitmap, Integer>());由此可见,当前的缓存的数据结构已经发生了变化,当前已经是HashMap,HashMa的优势在于删除离散的数据的效率高。
重点关注一下其删除对象的方法:
@Overrideprotected Bitmap removeNext() {Integer maxSize = null;Bitmap largestValue = null;Set<Entry<Bitmap, Integer>> entries = valueSizes.entrySet();synchronized (valueSizes) {for (Entry<Bitmap, Integer> entry : entries) {if (largestValue == null) {largestValue = entry.getKey();maxSize = entry.getValue();} else {Integer size = entry.getValue();if (size > maxSize) {maxSize = size;largestValue = entry.getKey();}}}}valueSizes.remove(largestValue);return largestValue;}由此可见,迭代获取最大的图片,并且进行删除。
接下来需要分析的类是LimitedAgeMemoryCache,
继续关注当前的成员变量:
private final MemoryCache cache;private final long maxAge;private final Map<String, Long> loadingDates = Collections.synchronizedMap(new HashMap<String, Long>());
可见当前的成员变量loadingDates,当前的是HashMap。
重点关注下面的成员变量
@Overridepublic Bitmap get(String key) {Long loadingDate = loadingDates.get(key);if (loadingDate != null && System.currentTimeMillis() - loadingDate > maxAge) {cache.remove(key);loadingDates.remove(key);}return cache.get(key);}
如果当前的文件已经达到删除的时间,就直接从缓存的数据结构中删除当前的对象。
由于比较多,这一讲就到这里停笔了,后面剩余的几个类将会在后面的文章中讲解。
1 0
- 详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)
- 详细讲解Android图片下载框架UniversialImageLoader之内存缓存(三)
- 详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)
- 详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存(一)
- android图片三级缓存之内存缓存
- PHP缓存之内存缓存(Memcache)
- Android性能优化(四)之内存优化实战
- Android内存优化之内存缓存
- Android内存优化之内存缓存
- 图片加载框架之内存缓存(一级缓存)设计(1)
- 图片加载框架之内存缓存(一级缓存)设计(2)
- 图片加载框架之内存缓存(一级缓存)设计(3)---- LruMemoryCache
- 计算机体系结构之内存讲解
- EGOCache缓存框架详细讲解
- EGOCache缓存框架详细讲解
- EGOCache缓存框架详细讲解
- EGOCache缓存框架详细讲解
- IOS开发(99)之内存缓存
- [转]浅析人脸检测之Haar分类器方法
- 递归方法实现多种进制的转换
- 【PCB设计】第22天,毕业设计PCB部分画完:ARM-A9+CYCLONE5+双32位deltasigmaADC
- 九大排序算法总结
- [矩阵快速幂] fzu 2117 特殊的数
- 详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)
- HDU—— 2500 做一个正气的杭电人
- Spring下载地址
- js变量的作用域
- 【Cocos2d-x】C++自定义线程安全消息管理
- 搭个简单Jersey+spring工程
- htmlunit网络爬虫相关
- nodeJs基础
- 单链表实现快排