Glide是一个非常好用的图片加载框架,它可以很好的缓存图片以提高图片加载效率。
但是在使用的时候,会出现一个问题:当服务器图片资源已经更新,但是URL地址不变时,Glide不会重新加载URL,而是从缓存中读取旧的图片资源。
下面给出两种解决方式:
1、仅使当前网络加载为服务器新数据——治标,一次性:
此方法关键在于指定RequestOptions的diskCacheStrategy(DiskCacheStrategy.NONE),并指定skipMemoryCache(true),必须同时指定,否则无效。
缺点:这样操作等于舍弃了Glide的图片缓存功能,每次都需要重新加载,虽然可以保证加载最新图片,但是当图片不经常改变时,这种做法就有点得不偿失了。
//更新头像
public void updateAvatar(){
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.ic_ex_logo)
.error(R.drawable.ic_ex_logo)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true);
Glide.with(aty).load(avatarUrl).apply(options).into(avatar);
2、使目标图片显示的所有地方均更新为服务器新数据——治本,永久性
在加载图片的时候调用下方给出的updateOptions()方法(PS:这个方法可以放在工具类中使用),给RequestOptions指定signature属性,当modified改变时,Glide会判断为新图片,并且重新缓存,这样加载的就是服务器最新图片了。
/**
* RequestOptions 一般指定以下属性即可
* placeholder : 图片加载时的站位图,可使用loading动画或默认图片
* error : 图片加载失败时的显示图片
* diskCacheStrategy : 图片缓存路径
*/
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.bg_round_graylight10)
.error(R.drawable.def_avatar)
.diskCacheStrategy(DiskCacheStrategy.DATA);
/**
* 刷新RequestOptions,解決Glide图片缓存导致不刷新问题
*
* @param options
* @param url 图片地址
* @param modified 图片修改时间
*/
public static void updateOptions(RequestOptions options, String url, long modified){
if(!Util.isEmpty(url) && url.contains(".")){
try{
String tail = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(tail);
options.signature(new MediaStoreSignature(type, modified, 0));
}catch (Exception e){}
}
}
总结:modified改变时,Glide会将当前URL判断为新资源并且重新缓存,并不会覆盖之前的缓存记录。也就是说如果APP中有多处地方需要显示这个图片,那么就需要在所有显示这个图片的位置给RequestOptions指定signature属性。
感谢网友的分享:
https://www.cnblogs.com/whoislcj/p/5565012.html