标签:android blog io ar 使用 sp java for 文件
内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧。
内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache、FuzzyKeyMemoryCache、LargestLimitedMemoryCache、LimitedAgeMemoryCache、LRULimitedMemoryCache、LruMemoryCache、UsingFreqLimitedMemoryCache以及WeakMemoryCache。
Ok,首先我们学习LimitedMemoryCache这个类。LimitedMemoryCache是LimitedMemoryCache的子类,其成员变量如下:
private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>());由此可知内存缓存的数据结构是线程安全的队列。
分析其函数,我们知道队列的操作在这里也是可以得到对应的体现。只是创建软引用的方法还是可以观察一下。
@Override
	protected Reference<Bitmap> createReference(Bitmap value) {
		return new WeakReference<Bitmap>(value);
	}          接下来,需要分析的第二个类是FuzzyKeyMemoryCache,按照类的注释,这个类是框架内部使用的,它实现了MemoryCache这个接口。当前的类的成员变量如下:
private final MemoryCache cache; private final Comparator<String> keyComparator;
接下来我们要分析的类是LargestLimitedMemoryCache,这个类依旧是LimitedMemoryCache的子类,
其成员变量如下:
private final Map<Bitmap, Integer> valueSizes = Collections.synchronizedMap(new HashMap<Bitmap, Integer>());由此可见,当前的缓存的数据结构已经发生了变化,当前已经是HashMap,HashMa的优势在于删除离散的数据的效率高。
重点关注一下其删除对象的方法:
@Override
	protected 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>());
重点关注下面的成员变量
@Override
	public 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);
	}
由于比较多,这一讲就到这里停笔了,后面剩余的几个类将会在后面的文章中讲解。
详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)
标签:android blog io ar 使用 sp java for 文件
原文地址:http://blog.csdn.net/zhangjiaofa/article/details/41255237