Glide4.0 StringSignature 找不到类

December 14, 2017

一、起因

旧版本Glide.signature()方法形参支持使用StringSignature。但在Glide 4.0里面这个方法不仅被移到RequestOptions中,而且形参改为Key

二、解决办法

2.1 Key

不过Key是一个接口,需要实现抽象方法

1
void updateDiskCacheKey(MessageDigest messageDigest);

2.2 ObjectKey

Key还有一个使用相对方便的子类ObjectKey,构造方法以Object为参数,下面是实际用法:

1
2
3
4
5
public static RequestOptions userAvatarOptions = new RequestOptions()
            .placeholder(R.drawable.def_avatar)
            .error(R.drawable.def_avatar)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .encodeQuality(70);

代码中创建了一个ObjectKey实例,并把当前时间戳整形值作为参数。

三、源码

顺便贴出KeyObjectKey的源码,请自行查阅:

3.1 Key

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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));
  }
}

四、参考链接