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