Glide v4 缓存解析

本文详细探讨了Glide v4的缓存策略,包括内存缓存和硬盘缓存的不同策略,如 DiskCacheStrategy 数据、资源和全部。讨论了缓存键值的构建,如何应对内存和磁盘缓存的变更。此外,还介绍了如何修改默认缓存配置以及源码分析,涉及RequestBuilder和SingleRequest的关键流程。
摘要由CSDN通过智能技术生成
  1. 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?

前两步检查图片是否在内存中,如果是则直接返回图片。后两步则检查图片是否在磁盘上,以便快速但异步地返回图片。如果四个步骤都未能找到图片,则Glide会返回到原始资源以取回数据(原始文件,Uri, Url等)。

缓存策略
内存缓存策略

内存中会缓存上述的活动资源 和 内存缓存资源; 活动资源采用采取了HashMap进行弱引用进行存储; 内存缓存资源采用LRU缓存进行存储;

硬盘缓存策略类型(见DiskCacheStrategy):
  1. DiskCacheStrategy.DATA:磁盘写入数据为未被加载过程修改过原始数据;
  2. DiskCacheStrategy.RESOURCE: 将解码,变换后的资源写入磁盘;
  3. DiskCacheStrategy.ALL:远程的资源(URL资源)会写入原始资源和变换后的资源;本地文件资源只会写入解码变换后的资源;
  4. DiskCacheStrategy.NONE: 不写入任何数据到硬盘;
  5. DiskCacheStrategy.AUTOMATIC:它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
缓存键值

不同于以往的缓存键值仅以URL作为唯一标识,Glide 针对不同缓存场景构建了不同的key,活动资源和内存缓存使用的键还和磁盘资源缓存略有不同,以适应内存 ,选项,比如影响 Bitmap 配置的选项或其他解码时才会用到的参数。 以内存键值为例,加入请求的资源的图片大小发生了变化,则无法命中缓存中的key,需要去磁盘中或者网络中重新获取后进行变化。 我们看下相关Key的构造方法;

EngineKey(
Object model,
Key signature,
int width,
int height,
Map<Class<?>, Transformation<?>> transformations,
Class<?> resourceClass, Class<?> transcodeClass,
Options options)

ResourceCacheKey(
ArrayPool arrayPool,
Key sourceKey,
Key signature,
int width,
int height,
Transformation<?> appliedTransformation, Class<?> decodedResourceClass,
Options options)

DataCacheKey(Key sourceKey, Key signature)

在 Glide v4 里,所有缓存键都包含至少两个元素:

  1. 请求加载的 model(File, Url, Url)。如果你使用自定义的 model, 它需要正确地实现 hashCode() 和 equals()
  2. 一个可选的 签名(Signature)

另外,步骤1-3(活动资源,内存缓存,资源磁盘缓存)的缓存键还包含一些其他数据,包括:

  1. 宽度和高度
  2. 可选的变换(Transformation)
  3. 额外添加的任何选项(Options)
  4. 请求的数据类型 (Bitmap, GIF, 或其他)
修改默认缓存配置

当然Glide也提供了修改默认的缓存配置项的方式;

//更改内存缓存配置大小(当然,可以定制自己的缓存)
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, Glid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值