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

问题描述 投票:0回答:1

用户可以更改图片(替换)。一旦用户改变了他们的图片,我希望新的图片能被缓存在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不推荐使用这种方法)。

我不知道如何才能只插入当前签名(应该会更快),而不是每次图像加载时都创建一个新的签名。能否帮助我?

android caching android-glide glide
1个回答
1
投票

我为此工作了好几天。

我知道你可能以前读过这个,但你忽略了它,因为你认为改变你的代码可能需要很多工作。但说真的,这是非常值得的。就我所知,它的性能优于所有其他介绍的方法,它是Glide推荐的解决方案,而且你不需要跳过缓存或创建签名,所以它也能让你的代码更干净。

在实践中: 好办法 使缓存文件无效,就是当内容发生变化时,尽可能改变你的标识符(url、ui、文件路径等)。- https:/bumptech.github.ioglidedoccaching.html。

解决方法:当用户上传新图片时,更改图片名称。当用户上传新图片时,更改图片的名称。获取文件名并以此为例。一旦图片的URL改变了,Glide就会明白你已经改变了图片,并会相应地更新Cache。到目前为止,这给我带来了最好的性能。

在使用时。

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

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


0
投票

两个选择

1)要为一个文件生成一个唯一的签名,你可以为它计算MD5签名。在文件被修改之前,它始终是唯一的。请看如何生成MD5签名 此处.

2)另一种设置唯一签名的方式可以是使用文件的最后修改时间。如果你确定只有你的应用会修改图片,而没有其他东西,那么你也可以依靠这个。要获得最后修改时间,请使用。

File file = new File("path/to/image");
String signature = Long.toString(file.lastModified());
© www.soinside.com 2019 - 2024. All rights reserved.