概述
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);
最后
以上就是长情秋天为你收集整理的Glide缓存机制之高级用法的全部内容,希望文章能够帮你解决Glide缓存机制之高级用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复