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

来源:互联网 发布:最近网络最流行的话 编辑:程序博客网 时间:2024/05/23 01:11
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.第一次获取在网上获取图片文件时,存入三级缓存中的代码示例:
1 0
原创粉丝点击