Glide.signature图片缓存

在缓存网络图片的过程中,有一种情况是图片的地址不变,但图片发生了变化,如果只按照图片的地址进行缓存,在加载缓存中的图片时就会发生图片一直显示为旧图的现象。

在App中修改用户头像的功能中,如果服务器存储头像的地址保持不变,加载缓存就会出现上述的情况。马上想到,当修改头像之后,马上将本地原头像的缓存清除,并加载新头像,此方法只是暂时解决了APP端头像的显示效果,如果在其他终端进行了头像修改,手机上并不能同步显示最新图片。

那么该如何获取最新的网络图片呢?显然不使用缓存是肯定可以显示最新的图片,但要使用缓存图片功能,又希望可以获取最新的图片,我们需要记录图片是否发生了变化,根据变化与否,选择是否更新缓存中的内容。

有人说下载图片之后,判断其SHA值是否相同,即可得知图片是否相同。然而,每次都要下载图片,再判断SHA值,还用缓存做什么,已经完全背道而驰。
好的做法是在服务器上加上图片是否改变的标识,在APP端存储该值,在加载缓存内容之前判断是否有改变,需要更新缓存内容。该标识可以使用时间戳,来记录图片更新时间,或使用累加数来记录标识。

当然,以上说的是处理自己的服务器上,数据可以增加字段的情况。如果只是单纯的加载网络上的图片,可以在图片下载之后,在APP中做标识,一段时间之内不更新,在一天或固定时间后检测标识并更新网络图片。比如一天更新一次,则可将日期作为标识。


1、想要重新加载图片

(URL没变,图片变了)

2、发现无法重新加载,以为是有缓存的原因

于是使用clear(view),但是只能清除控件上的图片,并不能真的清除缓存 
又使用clearMemory(),还是不行 
又使用clearDiskCache(),出现报错,提示要在background thread后台线程中调用,卧槽…. 
最后在Stack Overflow找到方法,如下


Glide.with(this)
    .load(URL)
    .signature(new StringSignature(UUID.randomUUID().toString()))  // 重点在这行
    .error(R.mipmap.ic_launcher)
    .into(setting_face_img);

3、原因

Glide中的图片缓存key的生成是通过一个散列算法来实现的,所以很难手动去删除指定的图片缓存 
Glide的图片缓存都有对应的唯一标识符,如果是相同的,就不加载调用缓存 
不过改变标识符很困难,所以Glide提供signature()方法,来附加一个数据到缓存key中

如果链接是文件,就用StringSignature, 
比如.signature(nre StringSignature(yourVersionMetadata)). 
如果链接是多媒体,就用MediaStoreSignature, 

比如.signature(new MediaStoreSignature(mimeType, dateModified, orientation)).



参考 https://blog.csdn.net/u013420865/article/details/53197788

猜你喜欢

转载自blog.csdn.net/iblade/article/details/79865354
今日推荐