小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Glide 加载相同路径图片不更新问题
问题表现
Glide 加载相同的url图片,或者是本地路径图片,当路径不更换,图片更换时,第二次加载时,图片不更新。
其实不仅仅是Glide,前端网站也会存在一样的问题,url地址图片改变,再次加载时还是原来的图片。
问题原因
Glide加载图片的时候默认使用缓存机制,第一次加载之后,会在内存和磁盘中进行缓存,第二次加载图片时根据地址先从内存中取出图片,内存中不存在时,就去磁盘中取,当内存和磁盘中都不存在时,才会真正的访问真实地址的图片。
所以在默认情况下,即时杀掉应用,也还有磁盘缓存。
解决方法
通过问题的原因,我们可以发现下面的解决办法,一个是禁用缓存(并不太推荐)。另一个是在地址后面拼上图片被修改时的时间戳,这样当图片修改时,再次加载就会使用新的时间戳地址,就不会出现问题(推荐)。还有一种办法就是,手动给图片增加标记,我这里用的方法是获取本地图片的MD5值,根据MD5值进行缓存,这样当图片变化时,MD5就肯定会变化,这样也就达到了相同图片使用缓存,不同图片重新加载的目的。
解决方法
-
保证每张图片的url不一样。 比如网络图片在地址后面拼上时间戳,本地图片的文件名也拼上时间戳。
-
本地跳过缓存。
.skipMemoryCache(true) // 不使用内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) // 不使用磁盘缓存
.into(imageView);
复制代码
- 使用签名,如果是本地文件,可以用文件的md5,或者文件的创建日期。
String md5="";
Glide.with(context).load(path).dontAnimate().signature(new ObjectKey(md5)).placeholder(imageView.getDrawable()).error(errorId).into(imageView);
复制代码
获取文件的md5的方法:
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
public class MD5Encoder {
/**
* 获取单个文件的MD5值
*
* @param file
* @return
*/
public static String getFileMD5(File file) {
if (!file.isFile()) {
return null;
}
MessageDigest digest = null;
FileInputStream in = null;
byte buffer[] = new byte[1024];
int len;
try {
digest = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer, 0, 1024)) != -1) {
digest.update(buffer, 0, len);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
}
}
复制代码