您的位置:首页 > 移动开发 > Android开发

关于Android开发中图片的三级缓存机制

2015-08-08 08:55 225 查看
1.Android应用中联网加载并显示图片时,为了用户体验和节省流量,一定用到图片的缓存。

2.关于三级缓存的理解:内存缓存(强引用存储)、内存缓存(软引用缓存)、内存缓存(弱引用缓存)、文件缓存(就是将图片存储为本地文件),由此组成三级缓存。

3.关于JAVA中的对象引用,分为:强、软、弱、虚。

4.关于JAVA的强引用与软引用:
(1)强引用:JVM不会回收任何具有强引用的对象,内存空间不足时,将抛出OOM异常;
(2)软引用:在内存不足时,JVM将会回收掉具有软引用的对象,从而满足程序运行的需求,以此避免出现OOM导致的程序崩溃。

5.关于LruCache类的理解:

这个类其实就是一个哈希表,存储键值对。

值得注意的是:LruCache内部存储的图片内存数量超过上限以后,将采用LRU算法删除部分图片。LRU:Least-Recently-Used,最近最少使用算法。

Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。

6.内存缓存部分:
(1)强引用存储区:
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)软引用存储区:
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();

7.文件缓存部分:
(1)获取本地存储的文件名:采用MD5算法,建立URL与文件名的唯一映射关系。将从网络下载的图片文件,存储为本地文件,命名为MD5转换的文件名。
(2)获取本地存储的路径:优先存储SD卡外部存储,找不到存储卡时,可以存储到内部存储。

8.从文件缓存中获取图片的流程:
强引用存储区---->软引用存储区---->文件存储----->网络获取---->显示UI

9.问题:在内存缓存中获取图片时,为什么先在强引用存储区查找,再去软引用存储区查找?
答:强引用存储区存储的图片,有上限,超过上限将会采用LRU算法进行删除;软引用存储区的图片,在内存不足时,JVM将会自动删除部分图片。

10.不同的API级别,计算Bitmap对象的内存占用大小的代码示例:

11.在内存缓存中取出Bitmap对象代码示例:

12.第一次获取在网上获取图片文件时,存入三级缓存中的代码示例:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息