以史为鉴
在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (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:规定最大的存储大小
put方法:将资源文件以键值对的方式添加到LinkedHashMap中
计算缓存size的大小,并判断是否达到最大限制
get方法:如果缓存中存在key对应的value,直接返回value。不存在则尝试创建一个value,并把它加入到map中
创建value需要花费时间,而这段时间,key对应的value可能已被赋值。那么我们创建的value值就没有存在的意义了。
主要原理在trimToSize方法中