图片的三级缓存

来源:互联网 发布:极限网络代挂 编辑:程序博客网 时间:2024/05/16 07:58

           图片的三级缓存  

我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了

图片的缓存这一操作机制。


原理:

Android图片三级缓存的原理如下图所示:



  首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中 也就是LruCache中。

如果强引用中空间不足,就会将较早存储的图片对象驱逐到软引用(softReference)中存储,然后将图片缓存到文件

(内部存储外部存储)中;读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,

则直接读取,如果强引用中不存在,则判断软引用中是否存在,如果软引用中存在,则将软引用中的图片添加到

强引用中并且删除软引用中的数据,如果软引用中不存在,则读取文件存储,如果文件存储不存在,则网络加载。

  下载: 网络--内存--文件

  读取: 内存--强引用--软引用--文件--网络


下面叙述一下三级缓存的流程:

  当我们的APP中想要加载某张图片时,先去LruCache中寻找图片,如果LruCache中有,则直接取出来使用,

如果LruCache中没有,则去SoftReference中寻找,如果SoftReference中有,则从SoftReference中取出图片使用,

同时将图片重新放回到LruCache中,如果SoftReference中也没有图片,则去文件系统中寻找,如果有则取出来使用,

同时将图片添加到LruCache中,如果没有,则连接网络从网上下载图片。图片下载完成后,将图片保存到文件系统中

,然后放到LruCache中。


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将会自动删除部分图片。

原创粉丝点击