一、概念
LruCache 是Android 3.1(API12)所提供的一个缓存类,缓存到达限制的时候优先删除近期最少使用。内部维护了一个 LinkedHashMap 以访问顺序排列,满了就删除尾元素(即近期最少使用的Least Recently Used),当获取缓存对象的同时会将该元素更新到队列头部。读写线程安全,对缓存的元素是强引用,不允许null键null值,为null说明没有缓存。
get() | public final V get(K key) 获取缓存过的数据,不存在返回null。 |
put() | public final V put(K key, V value) 添加/更新缓存数据。 |
remove() | public final V remove(K key) 移除缓存的数据。 |
evictAll() | public final void evictAll() 清除所有缓存数据 |
resize() | public void resize(int maxSize) 重新设置最大缓存容量 |
trimToSize() | public void trimToSize(int maxSize) 清除最老的缓存,直到剩余缓存数量满足指定大小 |
snapshot() | public synchronized final Map<K, V> snapshot() 返回一个Map集合,元素按缓存访问次数最少到最多。 |
二、使用
-
设置 LruCache 缓存大小,一般为当前进程可用内存的1/8。
-
重写 sizeOf() 计算出要缓存的对象的大小(总容量和对象大小计算的单位要一直一致)。
private val lruCache by lazy {
//获取当前进程可用内存大小,并分配1/8用于缓存
val cacheSize = (Runtime.getRuntime().totalMemory() / 1024 / 8).toInt()
object : LruCache<String, Bitmap>(cacheSize) {
//必须重写此方法来测量每张图片的大小(单位要跟总缓存的单位一致)
override fun sizeOf(key: String?, value: Bitmap?): Int {
//返回Bitmap大小(因为可以复用,换成更小的图也还是占用原来的大小)。
//而getByteCount()返回的是图片大小。
return value?.allocationByteCount ?: 0
}
}
}
//提供存入方法
fun putBitmap(key: String, value: Bitmap) {
lruCache.put(key, value)
}
//提供取出方法(返回null意味着不存在缓存)
fun getBitmap(key: String): Bitmap? {
return lruCache.get(key)
}