【问题标题】:Image Cache Signature in Glide with MetadataGlide 中的图像缓存签名与元数据
【发布时间】: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


    【解决方案1】:

    两种选择

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

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

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

    【讨论】:

    • 好的,所以我设法设置签名以及何时替换图像。当我在其他地方加载该图像时,它为什么仍然显示旧的缓存图像?我每次都需要传递新的签名吗?这似乎根本不合逻辑
    • @TheFluffyTRex 你找到解决办法了吗?
    【解决方案2】:

    我为此工作了好几天。

    我知道您之前可能已经阅读过这篇文章并忽略了它,因为您认为更改代码可能需要大量工作。但说真的,这是非常值得的。据我所知,性能优于所有其他方法,这是 Glide 推荐的解决方案,并且您不需要跳过缓存或创建签名,因此它也可以使您的代码更清洁。

    来自滑翔:

    实际上,使缓存文件无效的最佳方法是更改您的 内容更改时的标识符(url、uri、文件路径等) 可能的。 - https://bumptech.github.io/glide/doc/caching.html

    解决方案: 用户上传新图片时更改图片名称。获取文件名并使用它例如。一旦图片的 URL 改变了,Glide 就会知道你已经改变了图片并且会相应的更新缓存。 这给了我迄今为止最好的表现。

    使用时:

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

    它从不缓存图像,这确实使图像加载缓慢。你会认为签名对性能更好,我也成功地实现了它们。但对我来说,它们似乎和完全跳过缓存一样慢。

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2018-06-17
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多