概要
LRU(leastrecentlyused )是指最近最少使用的算法,以优先丢弃最近最少使用的缓存对象为主。
在我们的日常开发中,UI界面加载web图像是很普通的事情,但是如果界面上的图像太多,就不能每次都从web上获取图像,效率低下,同时用户的流量也非常消耗。
Android提供了LruCache类,可以使用它来缓存图像的内存。 今天一起学习吧。
使用LruCache加载图像
编写MyImageLoader类,实现图像缓存功能。
对代码的具体含义进行了注释解释。
在Activity中缓存和加载图像
其中的布局文件很简单,一个按钮和一个Imageview
代码还包含一些工具类,主要用于将图像的url转换为md5编码字符串,并将其保存为缓存文件中的key,以确保其唯一性
3 .实际使用
多次单击图像导入按钮,在log中检查是否正常缓存
可以看到,第一个图像不仅是从互联网下载的,而且是随后从缓存中获取的。
LruCache原理分析
LruCache文档说明
acachethatholdsstrongreferencestoalimitednumberofvalues.eachtimeavalueisaccessed,itismovedtotheheadofaqueue.whenavalueise thevalueattheendofthatqueueisevictedandmaybecomeeligibleforgarbagage
每次访问一个值时,包含有限数量的强引用的缓存都会移动到队列的开头,如果向已满的缓存队列添加新值,则队列中的最后一个值可能会被丢弃,并由垃圾回收机制回收。
LruCache构造函数
已创建链接散列图。 这三个参数分别为初始容量、加载因子和访问顺序,如果accessOrder为true,则此集合的元素顺序为访问顺序。 也就是说,在访问之后,此元素将被放在集合的最后。
有些人可能会怀疑,如果初始容量变为0,那不是就无法存储了吗? 那么,创建这个链接hashmap有什么意义呢?
其实解决这个问题并不难。 看看源代码就知道了
其实第一个参数是你设定的初始大小; 程序内部的实际初始大小为1。如果设定的“初始大小”(initialCapacity )小于1,则map大小将默认为1。 否则,继续向左移动(2),直到capacity大于您设置的initialCapacity;
LruCache的推送方法
的trimToSize ) )方法确定添加元素后是否超过了最大缓存数,如果超过,则清除最小的元素。
LruCache的get方法
LruCahche的get ()方法源
链接hashmap的get ) )方法源
afterNodeAccess ()方法源
LruCache的remove方法
从缓存中删除内容并更新缓存大小
总结
当缓存填满时,LruCache是最近使用的元素,内部使用LinkedHashMap存储的总缓存大小通常为可用内存的1/8。 使用get ()访问元素时,该元素会移动到链接hashmap的末尾