Glide-设置缓存的key

继承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设置的字符串有关联了










猜你喜欢

转载自blog.csdn.net/ZmeSky/article/details/80494476