用户可以更改图片(替换)。一旦用户更改了他们的图像,我希望新的图像被缓存在Glide中,并将旧图像从缓存中清除。
我已经阅读了网上的所有内容,但仍然不知道如何实现一个好的解决方案。
我尝试跳过本地内存和磁盘缓存,就像设置图像时一样:
GlideApp.with(fragment)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(view);
这个解决方案很慢,因为它每次都会调用新图像 - 它从不缓存新图像。
Glide文档说:
当内容更改时(url、uri、文件路径等),使缓存文件失效的最佳方法是在可能的情况下更改标识符。 - https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation
但对我来说不可能实现,因此Glide文档接着说:
由于更改标识符通常很困难或不可能,Glide还提供了signature() API,以将您控制的其他数据混入到缓存键中。
并给出了以下示例:
Glide.with(yourFragment)
.load(yourFileDataModel)
.signature(new ObjectKey(yourVersionMetadata))
.into(yourImageView);
但是问题来了。什么是好的“你的版本元数据”?我该如何创建和维护它?我看到过以下示例:
.signature(new ObjectKey(Long.toString(System.currentTimeMillis())))
这会导致磁盘缓存密钥每次加载图像时都会更改,因此很慢。我只需要在用户替换图像时更改密钥,而不是每次加载图像时都更改。
有人写道:
你可以做一些像生成新的UUID或每当图像更改时增加一个整数的事情。如果你选择这条路,你需要在某个地方跟踪每个图像的当前签名。- https://github.com/bumptech/glide/issues/2841
我不明白如何做到这一点。
我还尝试了Async任务完全删除缓存。它可以工作,但又很慢(而Glide不建议使用这种方法)。
我不知道如何仅插入当前签名(应该更快),而不是每次加载图像时都创建一个新签名。帮帮我?似乎替换图像并重新缓存它不应该那么困难!