Android——Lrucache内存缓存技术核心代码分析

以史为鉴

在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。

但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。

另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。


为了避免内存溢出的风险,同时又能快速的访问到图片,Lrucache内存缓存技术应运而生。


Lrucache简介

Google的package android.util.LruCache类为我们提够一个好用的内存缓存技术,非常适合用来缓存图片,可以让组件快速地重新加载和处理图片等资源不过考虑到兼容性,最好导入android.support.v4.util.LruCache这个类。

但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。


Lrucache核心源码

LruCache使用LinkedHashMap实现内存的缓存,没有软引用,都是强引用。
主要需要了解两个变量size和maxSize。

size:用来计算已经缓存的资源的存储大小
maxSize:规定最大的存储大小

Android——Lrucache内存缓存技术核心代码分析_第1张图片

put方法:将资源文件以键值对的方式添加到LinkedHashMap中
  计算缓存size的大小,并判断是否达到最大限制

Android——Lrucache内存缓存技术核心代码分析_第2张图片

get方法:如果缓存中存在key对应的value,直接返回value。不存在则尝试创建一个value,并把它加入到map中
创建value需要花费时间,而这段时间,key对应的value可能已被赋值。那么我们创建的value值就没有
存在的意义了。

Android——Lrucache内存缓存技术核心代码分析_第3张图片
Android——Lrucache内存缓存技术核心代码分析_第4张图片

主要原理在trimToSize方法中


Android——Lrucache内存缓存技术核心代码分析_第5张图片

Android——Lrucache内存缓存技术核心代码分析_第6张图片














你可能感兴趣的:(android)