Android图片缓存机制之LruCache和DiskLruCache

背景
当用户使用RecyclerView或者ListView的时候,频繁的发起网络请求不仅会消耗大量的流量,还会消耗大量的时间,毫无疑问,这样的用户体验相当糟糕。虽然Glide等图片加载框架已经替我们处理好了图片缓存的问题,但是我们仍然有必要去了解和学习图片缓存机制,才能更好帮助用户省时省流量,提升用户体验。
Android图片的三级缓存机制

  1. 内存缓存,读取速度最快。
  2. 硬盘缓存(文件缓存),读取速度比内存缓存稍慢。
  3. 网络缓存,读取速度最慢。

常用的API
缓存机制的通用调度算法是LRU,与内存缓存和硬盘缓存对应的类分别是LruCacheDiskLruCache,Android在Android 3.1加入了LruCache缓存类,而DiskLruCache并非谷歌官方编写,所以我们在写程序的时候不能直接调用,好在Jake Wharton大神集成了库,我们直接用就好了,只要在build.gradle添加如下语句:

implementation 'com.jakewharton:disklrucache:2.0.2'

1.LruCache常用API介绍

方法简介
LruCache(int maxSize)构造方法,maxSize是缓存大小
put(@NonNull K key, @NonNull V value)以键值对的方式存入内存缓存
get(@NonNull K key)使用键取出存入的值
remove(@NonNull K key)从内存缓存中移除指定键的值

2.DiskLruCache常用API介绍
DiskLruCache使用会比LruCache复杂,我们不能直接使用构造方法直接创建一个DiskLruCache,而是使用open(File directory, int appVersion, int valueCount, long maxSize)这个静态方法创建。如果想要将数据存入缓存,需要通过一个key获取到DiskLruCache.Editor对象,然后使用Editor对象获取输出流将我们的数据存入硬盘缓存,最后使用flush更新journal文件。

方法简介
open(File directory, int appVersion, int valueCount, long maxSize)directory是缓存目录,appVersion是版本号,valueCount是指定key可以对应多个缓存数量,
get(String key)返回Snapshot对象,通过调用该对象的getInputStream(int index)方法可以获取输入流
edit(String key)返回DiskLruCache.Editor对象
DiskLruCache.Editor的newOutputStream(int index)创建一个输出流,可以用来存入数据
DiskLruCache.Editor的commit()在使用输出流缓存数据后,使用commit()才会生效
DiskLruCache.Editor的abort()与commit()方法相反,使用abort()终止缓存生效
flush()同步缓存日志到journal文件

还有计算当前缓存数据字节的size()方法、关闭DiskLruCache的close()方法和清空缓存的delete()方法等。如果想深入学习,请移步郭神的Android高效加载大图、多图解决方案,有效避免程序OOM
具体代码实现,且看下回讲解
相关代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DerMing_You

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值