Android Glide中带元数据的图像缓存签名

Android Glide中带元数据的图像缓存签名,android,caching,android-glide,Android,Caching,Android Glide,用户可以更改图片(替换图片)。一旦用户更改了他们的图像,我希望新图像在Glide中缓存,旧图像从缓存中抛出 我已经在网上阅读了所有内容,但我仍然不知道如何实现一个好的解决方案 我尝试跳过本地内存和磁盘缓存,如设置映像时: GlideApp.with(fragment) .load(url) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .into(view); 这个解决方案很慢,因为它现在每次

用户可以更改图片(替换图片)。一旦用户更改了他们的图像,我希望新图像在Glide中缓存,旧图像从缓存中抛出

我已经在网上阅读了所有内容,但我仍然不知道如何实现一个好的解决方案

我尝试跳过本地内存和磁盘缓存,如设置映像时:

GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(view);
这个解决方案很慢,因为它现在每次都调用新映像—它从不缓存新映像

Glide文档说明:

使缓存文件无效的最佳方法是在内容(url、uri、文件路径等)发生更改时尽可能更改您的标识符。-

但这对我来说是不可能的,所以Glide文档说:

由于更改标识符通常很困难或不可能,所以滑动 还提供了signature()API来混合您需要的其他数据 控件插入到缓存密钥中

它给出了一个例子:

Glide.with(yourFragment)
    .load(yourFileDataModel)
    .signature(new ObjectKey(yourVersionMetadata))
    .into(yourImageView);
但问题来了。什么是好的“yourVersionMetadata”?如何创建和维护它?我见过这样的例子:

.signature(new ObjectKey(Long.toString(System.currentTimeMillis())))
这会导致每次加载映像时磁盘缓存键都会更改,因此速度较慢。我只需要在用户替换图像时更改它。并非每次加载图像时都如此

有人写道:

您可以在图像更改时生成一个新的UUID或增加一个整数。如果你走这条路,你必须在某处跟踪每张图像的当前签名。-

我不知道该怎么做

我还尝试了异步任务来完全删除缓存。这是可行的,但又是超慢的(Glide不建议使用这种方法)

我不知道如何插入当前签名(应该更快),而不是在每次加载图像时创建新签名。帮忙?它似乎取代了一个图像和重铸它不应该如此困难

两种选择

1) 要为文件生成唯一的签名,可以计算该文件的MD5签名。在文件被修改之前,它始终是唯一的。请参见如何生成MD5签名

2) 另一种设置唯一签名的方法是使用文件的上次修改时间。如果您确定只有您的应用程序会修改图像,而没有其他内容,那么您也可以依赖这一点。要获取上次修改的时间,请使用:

File file = new File("path/to/image");
String signature = Long.toString(file.lastModified());

我为此工作了好几天

我知道您以前可能读过这篇文章,但忽略了它,因为您认为更改代码可能需要很多工作。但说真的,这很值得。据我所知,它的性能超过了所有其他方法,这是Glide推荐的解决方案,而且您不需要跳过缓存或创建签名,这样也可以使代码更干净

从Glide:

实际上,使缓存文件无效的最佳方法是更改 内容更改时的标识符(url、uri、文件路径等) 可能

解决方案: 在用户上载新图像时更改图像的名称。获取文件名并使用它作为示例。一旦图像URL发生更改,Glide就会理解您已经更改了图像,并将相应地更新缓存这是迄今为止我表现最好的一次。

使用时:

.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)

它从不缓存图像,这确实使图像加载缓慢。您可能认为签名对性能更有利,我也成功地实现了它们。但对我来说,它们看起来就像完全跳过缓存一样慢。

好的,所以我设法设置了签名以及何时替换图像。为什么当我将旧的缓存图像加载到其他地方时,它仍然显示该图像?我每次都需要传递新的签名吗?这似乎完全不合逻辑