如何在Glide中从相同的URL重新加载图像?

17

我正在使用Glide图像加载器从特定的URL加载图像,现在如果我将图像更新到同一URL,Glide仍然会在我的ImageView中显示缓存的图像。如何从相同的URL重新加载图像?

6个回答

28
根据Glide维基中的Caching-and-Cache-Invalidation:
选项1(Glide v4):使用ObjectKey更改文件的修改日期时间。
Glide.with(requireContext())
    .load(myUrl)
    .signature(ObjectKey(System.currentTimeMillis().toString()))
    .into(myImageView)

选项1(Glide v3):使用StringSignature来更改文件的修改日期。

URLs - 尽管使服务器更改URL并在URL内容更改时更新客户端是使URL无效的最佳方式,但您也可以使用StringSignature混入任意元数据。

Glide.with(yourFragment)
    .load(url)
    .signature(new StringSignature(String.valueOf(System.currentTimeMillis()))
    .into(yourImageView);

如果所有其他方法都失败了,您既无法更改标识符,也无法跟踪任何合理的版本元数据,则可以选择以下选项之一:

选项2:您还可以使用diskCacheStrategy()DiskCacheStrategy.NONE完全禁用磁盘缓存。

Glide.with(Activity.this).load(url)
    .diskCacheStrategy(DiskCacheStrategy.NONE )
    .skipMemoryCache(true)
    .into(imageView);

参考资料:https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation


如果我只想在URL更改时加载图像怎么办? - MarGin
1
Glide 4签名的最新文档:https://bumptech.github.io/glide/doc/caching.html#cache-invalidation - charles-allen
1
当我尝试时,这两种方法都不显示为有效方法。 - Elliptica
2
天啊,我简直不敢相信这是最佳答案,而且其他答案也在重复它。.signature(ObjectKey(System.currentTimeMillis().toString())) 不是上次更新的日期时间(也没有办法通过访问来自动地知道文件最后一次在服务器上的更新时间),它只是基于当前时间的签名,所以每毫秒都会发生变化。这并非缓存,每次再次调用此调用以将同一图像加载到其他视图中时(并且已经过去了超过1毫秒),图像将再次从服务器获取。 - Stijak
@Stijak 是正确的。使用文件的最后修改日期而不是当前时间。示例:.signature(new ObjectKey(imageFile.lastModified())) - undefined

6
使用.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(context)
     .load(url)
     .apply(new RequestOptions()
             .placeholder(R.drawable.placeholder)
             .error(R.drawable.error)
             .diskCacheStrategy(DiskCacheStrategy.NONE)
             .skipMemoryCache(true))
     .into(ImageView);

如果我只想在URL更改时加载图像怎么办? - MarGin

5

添加

签名(新的ObjectKey(String.valueOf(System.currentTimeMillis())))

RequestOptions requestOptions = new RequestOptions();
            requestOptions.placeholder(R.drawable.cover_placeholder);
            requestOptions.error(R.drawable.no_image_available);
            requestOptions.signature(
                      new ObjectKey(String.valueOf(System.currentTimeMillis())));


Glide.with(MosaicFragment.this)
                 .setDefaultRequestOptions(requestOptions)
                 .load(finalPathOrUrl)

如果自从缓存文件后已经过去了多于一毫秒的时间,这只是缓存失效。最好不要有任何缓存,也比这强。 - Stijak

1
使用以下代码,对我而言运行良好。设置diskCacheStrategy(DiskCacheStrategy.NONE)skipMemoryCache(true)。这将每次加载图像。
Glide.with(Activity.this)
    .load(theImagePath)
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(myImageViewPhoto);

0

我使用了一个解决方法,因为其他方法对我都不起作用。

在我的情况下,我知道当服务器上的图像发生变化时,我只需在URL末尾添加?=,对于Glide来说,这将是一个新的URL,而不是使用缓存,Glide将加载新的图像。


0
在苦苦挣扎了几个小时后,我找到了解决办法。你可以通过添加StringSignature来混合文件的日期时间。这样,当文件加载时,它总是会使用最新的版本。就像这样
Glide.with(this)
.load(image_url)
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(imageview);

参考:https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation


1
如果自从文件被缓存以来已经过去了一毫秒以上,那么这只是缓存失效。最好不要缓存,也不要这样做。 - Stijak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接