【发布时间】:2020-08-05 15:09:43
【问题描述】:
用户可以更改图片(替换它)。一旦用户更改了他们的图像,我希望新图像被缓存在 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);
但是问题来了。什么是好的“yourVersionMetadata”?如何创建和维护它?我见过这样的例子:
.signature(new ObjectKey(Long.toString(System.currentTimeMillis())))
这会导致每次加载图像时磁盘缓存键都会更改,因此速度很慢。我只需要在用户替换图像时更改它。不是每次加载图片。
有人写道:
您可以执行诸如生成新 UUID 或在图像更改时增加整数等操作。如果你走那条路,你将不得不在某处跟踪每个图像的当前签名。 - https://github.com/bumptech/glide/issues/2841
我不明白该怎么做。
我还尝试了异步任务来完全删除缓存。它可以工作,但又超级慢(Glide 不推荐使用这种方法)。
我不知道如何只插入当前签名(应该更快),而不是每次加载图像时都创建一个新签名。帮助?它似乎替换图像并重新缓存它应该没有那么困难!
【问题讨论】:
标签: android caching android-glide