解决方法有两个:html
1.每次加载都清理缓存。
但这个方法是不可取的, 会致使每次都去网络加载图片. 显示很是慢. 这就至关于废弃了缓存这个好用的功能:java
Glide.with(this) .load(uri) .asBitmap() .centerCrop() .diskCacheStrategy( DiskCacheStrategy.NONE )//禁用磁盘缓存 .skipMemoryCache( true )//跳过内存缓存 .placeholder(R.mipmap.ic_head_default) .transform(new GlideCircleTransform(this)).into(headIV);
第二种方法:web
.signature(new StringSignature(UUID.randomUUID().toString()))//增长签名
这个api是增长签名,地址不变,改变这个签名参数也会不读取缓存从新请求。算法
Glide中的图片缓存key的生成是经过一个散列算法来实现的,因此很难手动去删除指定的图片缓存
Glide的图片缓存都有对应的惟一标识符,若是是相同的,就不加载调用缓存
不过改变标识符很困难,因此Glide提供signature()方法,来附加一个数据到缓存key中api
若是连接是文件,就用StringSignature,
好比: 缓存
.signature(new StringSignature(yourVersionMetadata));
若是连接是多媒体,就用MediaStoreSignature, 网络
好比:app
.signature(new MediaStoreSignature(mimeType, dateModified, orientation))
旧版本Glide中.signature()方法形参支持使用StringSignature。但在Glide 4.0里面这个方法不只被移到RequestOptions中,并且形参改成Key。dom
解决办法ide
Key
Key是一个接口,须要实现抽象方法
void updateDiskCacheKey(MessageDigest messageDigest);
ObjectKey
Key还有一个使用相对方便的子类ObjectKey,构造方法以Object为参数,下面是实际用法:
public static RequestOptions userAvatarOptions = new RequestOptions() .placeholder(R.drawable.def_avatar) .error(R.drawable.def_avatar) .signature(new ObjectKey(System.currentTimeMillis())) .encodeQuality(70);
代码中建立了一个ObjectKey实例,并把当前时间戳整形值做为参数。
源码
顺便贴出Key和ObjectKey的源码,请自行查阅:
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(); } 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)); } }
最终解决方案
RequestOptions userAvatarOptions = new RequestOptions() // .placeholder(R.drawable.def_avatar) // .error(R.drawable.def_avatar) .signature(new ObjectKey(System.currentTimeMillis())); Glide.with(ProfileActivity.this).applyDefaultRequestOptions(userAvatarOptions).load(iamgePath).apply(RequestOptions.bitmapTransform(new CircleCrop())). into(mIvApHeader);
参考: