珍惜作者劳动成果,如需转载,请注明出处。
http://blog.csdn.net/zhengzechuan91/article/details/50292871
Universal-Image-Loader 是一个优秀的图片加载开源项目,Github地址在 (Github地址) ,很多童鞋都在自己的项目中用到了。优秀的项目从来都是把简单留给开发者,把复杂封装在框架内部。ImageLoader作为Github上Star数过万的项目,备受开发者青睐,所以我们有必要搞清楚它的内部实现。
在上一篇博客中我们分析了ImageLoader框架的整体实现原理,还没有看过的直接到 深入解析开源项目之ImageLoader(一)框架篇 。
ImageLoader之内存缓存篇
由上图我们可以看出:
1.MemoryCache接口定义了Bitmap缓存相关操作;
public interface MemoryCache { boolean put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(String key); Collection<String> keys(); void clear(); }
2.抽象类BaseMemoryCache中则使用HashMap保存了Bitmap的软/弱引用;
public abstract class BaseMemoryCache implements MemoryCache { private final Map<String, Reference<Bitmap>> softMap = Collections.synchronizedMap(new HashMap<String, Reference<Bitmap>>()); @Override public Bitmap get(String key) { Bitmap result = null; Reference<Bitmap> reference = softMap.get(key); if (reference != null) { result = reference.get(); } return result; } @Override public boolean put(String key, Bitmap value) { softMap.put(key, createReference(value)); return true; } @Override public Bitmap remove(String key) { Reference<Bitmap> bmpRef = softMap.remove(key); return bmpRef == null ? null : bmpRef.get(); } @Override public Collection<String> keys() { synchronized (softMap) { //拿到softMap锁就可以读的时候不写 return new HashSet<String>(softMap.keySet()); } } @Override public void clear() { softMap.clear(); } protected abstract Reference<Bitmap> createReference(Bitmap value); }
对图片bitmap创建软应用的实现:
WeakMemoryCache,FIFOLimitedMemoryCache,LargestLimitedMemoryCache,LRULimitedMemoryCache,UsingFreqLimitedMemoryCache的实现一样
public class WeakMemoryCache extends BaseMemoryCache { @Override protected Reference<Bitmap> createReference(Bitmap value) { return new WeakReference<Bitmap>(value); } }
LimitedMemoryCache并没有实现createReference方法,所以是一个抽象类。
时间: 2024-10-12 07:55:30