30.android 三级缓存

1.三级缓存(网络+LruCache(原理分析)+DeskLruCache)

当手机上需要显示大量图片若是不停的进行网络请求,
很快就会OOM,这时三级缓存显得尤为重要,
适时地利用资源,进行图片缓存

1.三级缓存的顺序 
(1)内存缓存: 比如说需要加载图片时,系统第一步不会直接网络请求,而是首先找第一级缓存—内存缓存 
(2)本地缓存: 如果内存缓存中没有,就会从第二级缓存—本地缓冲(即sd卡) 
(3)网络缓存: 如果本地缓存中没有,就会从网络缓存中下载图片。

2. 三级缓存级别总结 
(1)内存缓存: 速度快, 优先读取 
(2)本地缓存: 速度其次, 内存没有,读本地 
(3)网络缓存: 速度最慢, 本地也没有,才访问网络

    1. 网络缓存


         
(1)doInBackground : 核心方法,请求网络。

(2)onPostExecute: 核心方法,图片加载完成后,显示在手机屏幕上。

  2. 本地缓存


(1)putBitmapToLocal: 这里我们将每个存储图片的文件名设为 图片对应的url地址(MD5加密后的),
判断父文件是否存在,不存在则新建,存在则直接存储进去。

(2)getBitmapToLocal: 先从方法参数中获取到图片对应的url,
进行查找,若存在则将图片的Bitmap返回回去(最好返回前先压缩),不存在则返回null。

扫描二维码关注公众号,回复: 2785519 查看本文章

3. 内存缓存

HashMap版
两个方法,一个是设置内存缓存方法—putBitmapToLocal,一个是取内存缓存方法—getBitmapToLocal。
用对象来存储图片,集合来存储对象,集合都在内存里面,所以决定用集合。 

 软引用版
Bitmap对象虽存在于集合中,但我们每次都 new 一个新的Bitmap,如果有大量的图片,
集合内存根本不够,很快就会OOM,也就是内存溢出。
集合中有许多个对象,都被集合引用!这个引用一直在!垃圾回收器并不会回收,所以会导致内存溢出。
以上只是一方面,而且即使它会回收这些引用的集合,
可它是隔一段时间才会回收,无法及时清理内存!

内存缓存中的 引用级别 

(1) 强引用 默认引用, 即使内存溢出,也不会回收 

(2) 软引用 SoftReference, 内存不够时, 会考虑回收 

(3) 弱引用 WeakReference 内存不够时, 更会考虑回收 

(4)虚引用 PhantomReference 内存不够时, 最优先考虑回收!

回收器断然不会回收强引用,而虚引用则太容易被回收,所以最常用的是软引用 和 弱引用,
在需求不强烈或内存实在是不够的情况下,垃圾回收器才会回收引用的对象。
我们主要回收的是Bitmap对象,对集合进行包装,使用软引用。


        LruCache
自从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,
这让软引用和弱引用变得不再可靠。
这么说来即使内存很充分的情况下,也有优先回收弱引用和软引用。 

LruCache : 可以将最近最少使用的对象回收掉, 从而保证内存不会超出范围! 

 LruCache 的 核心 
最核心的地方其实就是维护一个 HashMap,再设置了一个全局变量 size来计算变量的总大小。
一旦超出大小,就开始删除对象,从而保证内存量在规定范围内!
 

      DiskLruCache
LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,
那么又需要从网络上重新加载一次图片,这显然非常耗时。
Google提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。
DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,
存储在SD卡上,即使缓存再多的数据也不会对手机的内置存储空间有任何影响。
DiskLruCache是不能new出实例的,如果我们要创建一个DiskLruCache的实例,
则需要调用它的open()方法。

猜你喜欢

转载自blog.csdn.net/weixin_42061754/article/details/81453202