1.图片缓存的原理
- 内存缓存,在SDK3.0之前,softreference(软引用)List<SoftReference> list;
3.0之后,google已经不推荐使用softreference,推荐使用LruCache(least recently used 最近最少使用) - 本地缓存:数据持久化
- 网络缓存
- cache缓存策略
1.首先从内存里取
2.其次从本地获取,往内存里存一份
3.从网络加载,往内存和本地各存一份
- Lrucache:线程安全,底层数据结构linkedHashMap
- DiskLrucache: 初始化open,存入数据edit,取数据get;size()返回本地缓存文件的大小,delete()遍历删除所有本地文件
2.图片缓存的比较
- 内存缓存, 优先加载, 速度最快
- 本地缓存, 次优先加载, 速度快
- 网络缓存, 不优先加载, 速度慢,浪费流量
3.开发中如何避免OOM异常?如果出现来OOM异常应该如何处理?
- 缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存,eg:
Bitmap bitmap = BitmapFactory.decodeFile(path);mImageCache.put(path, new SoftReference<Bitmap>(bitmap));
- 调整图像大小,onLoadingComplete()手机屏幕尺寸有限,分配给图像的显示区域本身就更小,有时图像大小可以做适当调整;
- 采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;
- 及时回收图像,如果引用了大量Bitmap对象,而应用又不需要同时显示所有图片,可以将暂时用不到的Bitmap对象及时回收掉;bitmap.recycle();mImageCache.remove(path);
- 自定义堆内存分配大小,优化Dalvik虚拟机的堆内存分配;