一、三级缓存的由来
现在App都是需要网络的,那通过网络获取图片在正常不过得事了,假如每次启动App的时候都从网络拉取图片的话,势必会消耗很多流量,一个很耗流量的应用,其用户数量级肯定要受到影响
特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知.所以我们要图片进行缓存,从而避免流量的浪费。
二、什么是三级缓存
三级缓存是内存缓存,本地缓存,网络缓存。第一次安装打开App的时候肯定是先通过网络来获取图片,获取之后我们把图片保存在本地,和内存中。之后再运行App的时候,就优先访问内存中的图片,如果内存中没有,就访问本地,只有在初次访问新的内容时,才通过网络来获取。所以内存缓存优先加载,速度最快,其次本地,最后才是网络,这样可以必变流量的浪费。
三、三级缓存的原理
3.1、内存缓存
内存缓存LruCache是Android 3.1所提供的一个缓存类,所以我们可以直接使用LruCache实现内存缓存。LruCache维护了一个缓存对象列表 LinkedHashMap,LruCache还可以设置缓存的大小,一般为当前进程可用容量的1/8。重写sizeOf方法,可以计算出要缓存的每张图片的大小。当调用put()方法时,就会在集合中添加元素,并调用trimToSize()判断缓存是否已满,如果满了就用LinkedHashMap的迭代器删除队尾元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get()方法获得对应集合元素,同时会更新该元素到队头。
3.2、磁盘缓存
3.2.1、DiskLruCache并不是由Google官方编写的,所以这个类并没有被包含在Android API当中,我们需要将这个类从网上下载下来,然后手动添加到项目当中。
DiskLruCache是不能new出实例的,如果我们要创建一个DiskLruCache的实例,则需要调用它的open()方法,open()方法接收四个参数,第一个参数指定的是数据的缓存地址,第二个参数指定当前应用程序的版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1,第四个参数指定最多可以缓存多少字节的数据。
3.2.2、写入缓存
借助DiskLruCache.Editor这个类完成的。这个类也是不能new的,需要调用DiskLruCache的edit()方法来获取实例,edit()方法接收一个参数key,这个key将会成为缓存文件的文件名,并且必须要和图片的URL是一一对应的。因为图片URL中可能包含一些特殊字符,这些字符有可能在命名文件时是不合法的。所以我们要将图片的URL进行MD5编码,编码后的字符串肯定是唯一的,并且只会包含0-F这样的字符,完全符合文件的命名规则。
3.2.3、读取缓存
读取的方法要比写入简单一些,主要是借助DiskLruCache的get()方法实现的,get()方法要求传入一个key来获取到相应的缓存数据,而这个key毫无疑问就是将图片URL进行MD5编码后的值了。
3.3、网络缓存