最近真的太懒了,想尽各种理由说服自己不干活 , 辛苦啊!
近段时间,项目中的图片加载出了些问题(加载失败啦,OOM啦),就去重新看了目前流行的图片加载缓存框架,看的过程中就感觉受益东西还是应该记录下来,下面就记录一下LruCache 和 DiskLruCache的原理
LruCache 的实现原理
LruCache 实现最核心的东西就是LinkedHashMap , LruCache的Lru算法就是通过LinkedHashMap来实现的.说到这里呢,就有必要先说下LinkedHanhMap.
LinkedHanhMap是什么东东.首先呢,从名字上看,LinkedHanhMap还是map,只不过笔HashMap稍微变态一点而已,LinkedHanhMap继承与HashMap , 但是LinkedHanhMap使用了一个双向链表来存储Map中的Entry(这是啥,可以理解为map中存放key和value一个对象,HashMap会通过Key的hash值在bucket中找这个对象,突然发现这里一两句说不清楚,还是自行去了解吧)顺序关系,这种循序有两种,一种是插入顺序,另一种便是LruCache是用Lru顺序,使用哪种可以通过LinkedHanhMap的构造方法来指定。所以呢,LinkedHanhMap对于get,put,remove等操作除了要做HashMap该做的事情,还得调整Entry在链表中的顺序.
说完LinkedHanhMap,我们就该说LruCache了,LruCache就是通过设置LinkedHanhMap的链表顺序为Lru来实现Lru缓存的. 实现方式:当我们调用LruCache 的get方法获取缓存对象(Entry),put方法插入新的对象,LruCache都会把它们放到链表的尾端.这样当缓存内存使用达到设定最大值的时候,便会将链表表头的对象移除掉(经常被操作的都放在链表微端了,表头对象肯定就是不常用的).这就是LruCache的缓存管理方式,很简答吧.但是很有借鉴意义,简单实用才是最好的.
DiskLruCacher 的实现原理
DiskLruCacher应该是源于google的一个开源项目BitmapFun,记忆中Bitmapfun中是有一个DiskLruCacher类的,这个工程师Google自己的培训教程.而DiskLruCacher就是用来做磁盘缓存的,而用的缓存机制也是Lru(LruCache 的Lru算法一毛一样哦)算法.好吧,我承认,我要开始偷懒了,DiskLruCacher源码不多,而且网上这方面的源码分析一大堆,就不写了,收工.