Glide 加载相同路径图片不更新问题

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Glide 加载相同路径图片不更新问题

问题表现

Glide 加载相同的url图片,或者是本地路径图片,当路径不更换,图片更换时,第二次加载时,图片不更新。

其实不仅仅是Glide,前端网站也会存在一样的问题,url地址图片改变,再次加载时还是原来的图片。

问题原因

Glide加载图片的时候默认使用缓存机制,第一次加载之后,会在内存和磁盘中进行缓存,第二次加载图片时根据地址先从内存中取出图片,内存中不存在时,就去磁盘中取,当内存和磁盘中都不存在时,才会真正的访问真实地址的图片。

所以在默认情况下,即时杀掉应用,也还有磁盘缓存。

解决方法

通过问题的原因,我们可以发现下面的解决办法,一个是禁用缓存(并不太推荐)。另一个是在地址后面拼上图片被修改时的时间戳,这样当图片修改时,再次加载就会使用新的时间戳地址,就不会出现问题(推荐)。还有一种办法就是,手动给图片增加标记,我这里用的方法是获取本地图片的MD5值,根据MD5值进行缓存,这样当图片变化时,MD5就肯定会变化,这样也就达到了相同图片使用缓存,不同图片重新加载的目的。

解决方法

  1. 保证每张图片的url不一样。 比如网络图片在地址后面拼上时间戳,本地图片的文件名也拼上时间戳。

  2. 本地跳过缓存。


.skipMemoryCache(true) // 不使用内存缓存

.diskCacheStrategy(DiskCacheStrategy.NONE) // 不使用磁盘缓存

.into(imageView);

复制代码
  1. 使用签名,如果是本地文件,可以用文件的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);

}

}

复制代码

猜你喜欢

转载自juejin.im/post/7019529323455447071