用户可以更改图片(替换)。一旦用户改变了他们的图片,我希望新的图片能被缓存在Glide中,而旧的图片能被扔出缓存。
我已经阅读了网上的所有内容,但我仍然不知道如何实现一个好的解决方案。
我试过像设置镜像时那样跳过本地内存和磁盘缓存。
GlideApp.with(fragment)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(view);
这个解决方案很慢,因为它现在每次都会调用新的镜像--它从不缓存新的镜像。
Glide文档中说。
使缓存文件失效的最好方法是在内容发生变化(url、ui、文件路径等)时尽可能地改变你的标识符。- https:/github.combumptechglidewikiCaching-and-Cache-Invalidation。
但这对我来说是不可能的,所以Glide文档就说。
由于通常很难或者不可能改变标识符 Glide还提供了签名()API 来在你的缓存密钥中加入你所控制的额外数据。
而且它还给出了这个例子。
Glide.with(yourFragment)
.load(yourFileDataModel)
.signature(new ObjectKey(yourVersionMetadata))
.into(yourImageView);
但问题来了 什么才是好的 "yourVersionMetadata"?我如何创建和维护它?我看到过这样的例子。
.signature(new ObjectKey(Long.toString(System.currentTimeMillis())))
这将导致每次加载映像时磁盘缓存密钥都会改变,所以很慢。我只需要它在用户替换图像时改变。而不是每次加载镜像的时候。
有人写道。
你可以做一些事情,比如生成一个新的UUID,或者在图像改变时增加一个整数。如果你走这条路,你就必须在某个地方跟踪每个图片的当前签名。- https:/github.combumptechglideissues2841
我不明白该怎么做。
我还尝试了彻底删除缓存的Async任务。它可以工作,但又是超级慢(而且Glide不推荐使用这种方法)。
我不知道如何才能只插入当前签名(应该会更快),而不是每次图像加载时都创建一个新的签名。能否帮助我?
我为此工作了好几天。
我知道你可能以前读过这个,但你忽略了它,因为你认为改变你的代码可能需要很多工作。但说真的,这是非常值得的。就我所知,它的性能优于所有其他介绍的方法,它是Glide推荐的解决方案,而且你不需要跳过缓存或创建签名,所以它也能让你的代码更干净。
在实践中: 好办法 使缓存文件无效,就是当内容发生变化时,尽可能改变你的标识符(url、ui、文件路径等)。- https:/bumptech.github.ioglidedoccaching.html。
解决方法:当用户上传新图片时,更改图片名称。当用户上传新图片时,更改图片的名称。获取文件名并以此为例。一旦图片的URL改变了,Glide就会明白你已经改变了图片,并会相应地更新Cache。到目前为止,这给我带来了最好的性能。
在使用时。
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
它从不缓存图片,这真的让图片加载缓慢。你会认为签名对性能更好,我也成功地实现了它们。但在我看来,它们似乎和完全跳过缓存一样慢。
两个选择
1)要为一个文件生成一个唯一的签名,你可以为它计算MD5签名。在文件被修改之前,它始终是唯一的。请看如何生成MD5签名 此处.
2)另一种设置唯一签名的方式可以是使用文件的最后修改时间。如果你确定只有你的应用会修改图片,而没有其他东西,那么你也可以依靠这个。要获得最后修改时间,请使用。
File file = new File("path/to/image");
String signature = Long.toString(file.lastModified());