一、起因
舊版本Glide中.signature()方法形參支持使用StringSignature。但在Glide 4.0里面這個(gè)方法不僅被移到RequestOptions中,而且形參改為Key。
二、解決辦法
2.1 Key
不過(guò)Key是一個(gè)接口,需要實(shí)現(xiàn)抽象方法
void updateDiskCacheKey(MessageDigest messageDigest);
2.2 ObjectKey
Key還有一個(gè)使用相對(duì)方便的子類ObjectKey,構(gòu)造方法以Object為參數(shù),下面是實(shí)際用法:
public static RequestOptions userAvatarOptions = new RequestOptions()
.placeholder(R.drawable.def_avatar)
.error(R.drawable.def_avatar)
.signature(new ObjectKey(System.currentTimeMillis()))
.encodeQuality(70);
代碼中創(chuàng)建了一個(gè)ObjectKey實(shí)例,并把當(dāng)前時(shí)間戳整形值作為參數(shù)。
三、源碼
順便貼出Key和ObjectKey的源碼,請(qǐng)自行查閱:
3.1 Key
public interface Key {
String STRING_CHARSET_NAME = "UTF-8";
Charset CHARSET = Charset.forName(STRING_CHARSET_NAME);
void updateDiskCacheKey(MessageDigest messageDigest);
@Override
boolean equals(Object o);
@Override
int hashCode();
}
3.2 ObjectKey
public final class ObjectKey implements Key {
private final Object object;
public ObjectKey(Object object) {
this.object = Preconditions.checkNotNull(object);
}
@Override
public String toString() {
return "ObjectKey{"
+ "object=" + object
+ '}';
}
@Override
public boolean equals(Object o) {
if (o instanceof ObjectKey) {
ObjectKey other = (ObjectKey) o;
return object.equals(other.object);
}
return false;
}
@Override
public int hashCode() {
return object.hashCode();
}
// Charset CHARSET = Charset.forName("UTF-8");
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
messageDigest.update(object.toString().getBytes(CHARSET));
}
}