Glide缓存机制之高级用法

本文探讨了Glide缓存机制在处理含有动态参数URL时可能导致的缓存失效问题。通过分析Glide的源码,指出缓存key的生成方式,并提出创建自定义`MyGlideUrl`类来重写`getCacheKey()`,移除动态参数(如token),以确保正确缓存。在实际应用中,可以使用`Glide.with(this).load(new MyGlideUrl(url)).into(imageView)`加载图片,从而优化缓存效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Glide缓存机制:高级用法


结合前面的内存缓存和硬盘缓存,我们发现缓存的key是由传入的url决定的,而现实中我们的项目图片资源可能在url
后面拼接上如token参数这些随时变化的参数,这样就会使我们的缓存失效

来到Glide生成key的地方

public <T, Z, R> LoadStatus load(Key signature, int width, int height, DataFetcher<T> fetcher,
            DataLoadProvider<T, Z> loadProvider, Transformation<Z> transformation, ResourceTranscoder<Z, R> transcoder,
            Priority priority, boolean isMemoryCacheable, DiskCacheStrategy diskCacheStrategy, ResourceCallback cb) {
        Util.assertMainThread();
        long startTime = LogTime.getLogTime();

这里的fetcher其实就是HttpUrlFetcher
        final String id = fetcher.getId();
        EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
                loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
                transcoder, loadProvider.getSourceEncoder());
}

HttpUrlFetcher的getId()
@Override
    public String getId() {
        return glideUrl.getCacheKey();
    }

public String getCacheKey() {
      return stringUrl != null ? stringUrl : url.toString();
    }

发现id就是url(如果是string类型的就是本身,如果是Url对象就是url.toString())

所以我们的解决办法就是创建一个MyGlideUrl继承自Glide的GlideUrl重写getCacheKey()
public class MyGlideUrl extends GlideUrl {


private String mUrl;
public MyGlideUrl(String url) {
super(url);
this.mUrl = url;
}


@Override
public String getCacheKey() {
return mUrl.replace(tokenParam(), "");
}


private String tokenParam() {
String param = "";
int tokonIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
if (tokonIndex != -1) {
int nextIndex = mUrl.indexOf("&", tokonIndex + 1);
if (nextIndex != -1) {
   param = mUrl.substring(tokonIndex + 1, nextIndex + 1);
} else {
param = mUrl.substring(tokonIndex);
}
}


return param;
}
}

activity中引用:
Glide.with(this).load(new MyGlideUrl(url)).into(imageView);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值