Android 优化 - 内存缓存 LruCache

一、概念

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集合,元素按缓存访问次数最少到最多。

二、使用

  1. 设置 LruCache 缓存大小,一般为当前进程可用内存的1/8。

  2. 重写 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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值