Android图片缓存机制之LruCache和DiskLruCache
背景
当用户使用RecyclerView或者ListView的时候,频繁的发起网络请求不仅会消耗大量的流量,还会消耗大量的时间,毫无疑问,这样的用户体验相当糟糕。虽然Glide等图片加载框架已经替我们处理好了图片缓存的问题,但是我们仍然有必要去了解和学习图片缓存机制,才能更好帮助用户省时省流量,提升用户体验。
Android图片的三级缓存机制
- 内存缓存,读取速度最快。
- 硬盘缓存(文件缓存),读取速度比内存缓存稍慢。
- 网络缓存,读取速度最慢。
常用的API
缓存机制的通用调度算法是LRU,与内存缓存和硬盘缓存对应的类分别是LruCache和DiskLruCache,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
具体代码实现,且看下回讲解
相关代码
上一篇: Java判断是否包含中文/中文字符
下一篇: 适用于高并发的本地缓存方案