LruCache图片内存缓存
1,概念
LruCache这个类位于android-support-v4包下,LRU即Least Recently Used,近期最少使用算法。也就是当内存缓存达到设定的最大值时将内存缓存中近期最少使用 的对象移除,有效的避免了OOM的出现。
什么是OOM:
OOM(out of memory)即内存泄露。一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当该对象占用的内存无法被回收时,就容易造成内存泄露。
2,原理
讲到LruCache不得不提一下LinkedHashMap,因为LruCache中Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, boolean accessOrder)指定。所以,对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。
3,使用
以listview加载网络图片为例
1.1,在适配器的构造函数中进行初始化操作:通过构造函数LruCache<T, T>(int maxSize)创建对象,其中参数maxSize为指定的最大内存,也就是指定缓存的容量.通 常我们先获取系统分配给每个应用程序的最大内存,每个应用系统一般分配(32M),然后将其分配的1/8作为我们缓存的最大值(容量),
获取系统应用最大内存的方式
int maxMemory = (int) Runtime.getRuntime().maxMemory()
1.2,在创建LruCache对象的同时,重写int sizeOf(String key, Bitmap value){}来计算bitmap的大小,也就是衡量每张图片的大 小,此方法默认返回图片数量.
2,添加缓存
首次加载网络图片时候,调用put(K key, V value)将图片加入缓存中,其中图片url作为key,bitmap作为value.
3,获取缓存
当多次加载展示该图片的时候,我们首先从调用get(K key)方法从缓存中读取,读取结果不为null就直接展示使用,否则再次从网络请求数据.
4,移除缓存
假如内存中的资源需要移除的时候,我们可以调用remove(key)来进行移除缓存缓存的操作.
5,清空缓存
当我们需要释放内存的时候可以调用evictAll()方法,来做清楚缓存的操作.
6,已经缓存的大小
size()
7,缓存容量
maxSize()
8,成功获取到缓存的次数
hitCount()
9,获取不到缓存次数
missCount()
10,创建缓存资源次数
createCount()
11,添加缓存次数
.putCount()
12,清除缓存次数
evictionCount()
13,重新设置缓存的容量
resize(int maxSize)
24576,49152,-->49152.
14,删除缓存到指定容量以下.
trimToSize(int maxSize)
1121,-->449


网友评论