欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android图片缓存机制之LruCache和DiskLruCache

程序员文章站 2022-03-04 15:00:48
...

背景
当用户使用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
具体代码实现,且看下回讲解
相关代码

相关标签: 缓存