继承GildeUrl类
在项目开发中遇到了一个问题:
图片是上传到阿里云上的,因为图片是私有的,图片地址后面会带有一些权限的认证,这样用一张图片地址会经常的变化,这样用gilde默认的缓存基本上失效。
public class Engine implements EngineJobListener,
MemoryCache.ResourceRemovedListener,
EngineResource.ResourceListener {
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();
final String id = fetcher.getId();
EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
transcoder, loadProvider.getSourceEncoder());
...
}
...
}
蓝色部分id其实就是图片的url,EnginKey就是glide图片缓存的key。
fetcher源码:
public class HttpUrlFetcher implements DataFetcher<InputStream> {
private final GlideUrl glideUrl;
...
public HttpUrlFetcher(GlideUrl glideUrl) {
this(glideUrl, DEFAULT_CONNECTION_FACTORY);
}
HttpUrlFetcher(GlideUrl glideUrl, HttpUrlConnectionFactory connectionFactory) {
this.glideUrl = glideUrl;
this.connectionFactory = connectionFactory;
}
@Override
public String getId() {
return glideUrl.getCacheKey();
}
...
}
从代码可以看到,getId获取的url其实就是glideUrl的getCacheKey方法返回的。
GlideUrl源码:
public class GlideUrl {
private final URL url;
private final String stringUrl;
...
public GlideUrl(URL url) {
this(url, Headers.DEFAULT);
}
public GlideUrl(String url) {
this(url, Headers.DEFAULT);
}
public GlideUrl(URL url, Headers headers) {
...
this.url = url;
stringUrl = null;
}
public GlideUrl(String url, Headers headers) {
...
this.stringUrl = url;
this.url = null;
}
public String getCacheKey() {
return stringUrl != null ? stringUrl : url.toString();
}
...
}
可以看出getCacheKey方法,如果传入的是字符串,就直接返回,如果是URL就返回toString()。
这样的话就可以继承GlideUrl,重写getCacheKey方法,自己处理要返回的key。
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
@Override
public String getCacheKey() {
if(!TextUtils.isEmpty(mUrl)&& mUrl.contains("\\?")){
String[] urlArr = mUrl.split("\\?");
if(urlArr.length > 0){
return urlArr[0];
}
}
return mUrl;
}
}
实际调用方式:
Glide.with(this)
.load(new MyGlideUrl(url))
.into(imageView);
从上面的分析中,发现EngineKey是缓存的key,它的参数有很多,其中有个signature,当我们在项目中,图片url不变,但是缓存的策略不是以url当做key,就可以用到这个signature。GlideUrl提供了对应的方法。
Glide.with(this)
.load(url)
.signature(new StringSignature("id"))
.into(imageView);
这样key就与url和StringSignature设置的字符串有关联了