LruCache:是Android 3.1(API12)所提供的一个缓存类,缓存到达限制的时候优先删除近期最少使用。
LRU算法原理:内部维护了一个 LinkedHashMap 是以访问顺序排列的满了就删除尾元素(即近期最少使用的Least Recently Used),当获取缓存对象的同时会将该元素更新到队列头部。读写线程安全,对缓存的元素是强引用,不允许null键null值,为null说明没有缓存。
设置 LruCache 缓存大小,一般为当前进程可用内存的1/8。
重写 sizeOf() 计算出要缓存的对象的大小。()总容量和对象大小计算的单位要一直一致
//获取当前进程可用内存大小,并分配1/8用于缓存
private val cacheSize = Runtime.getRuntime().totalMemory() / 1024 / 8
private val lruCache = object : LruCache<String, Bitmap>(cacheSize.toInt()) {
//必须重写此方法来测量每张图片的大小(单位要跟总缓存的单位一致)
override fun sizeOf(key: String?, value: Bitmap?): Int {
return value?.allocationByteCount ?: 0
}
}
//提供存入方法
fun putBitmap(key: String, value: Bitmap) {
lruCache.put(key, value)
}
//提供取出方法(返回null意味着不存在缓存)
fun getBitmap(key: String): Bitmap? {
return lruCache.get(key)
}