【问题标题】:How to reload image in Glide from the same url?如何从相同的 url 在 Glide 中重新加载图像?
【发布时间】:2018-06-01 20:17:48
【问题描述】:

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

【问题讨论】:

    标签: android android-glide image-loading


    【解决方案1】:

    使用.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 更改时加载图像怎么办?
    【解决方案2】:

    使用下面的代码,它对我来说很好用。设置 diskCacheStrategy(DiskCacheStrategy.NONE)skipMemoryCache(true)。每次都会加载图片。

    Glide.with(Activity.this)
        .load(theImagePath)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true)
        .into(myImageViewPhoto);
    

    【讨论】:

      【解决方案3】:

      根据Glide wiki 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 - 虽然使 URLs 失效的最佳方法是确保服务器更改 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 更改时加载图像怎么办?
      • 当我尝试时,这些都不是有效的方法
      • 天啊。我不敢相信这是最好的答案,这在其他答案中重复出现。 .signature(ObjectKey(System.currentTimeMillis().toString())) 不是上次更新的日期时间(我们也不能神奇地知道文件上次在服务器上更新而不点击它),它只是基于当前时间的签名,所以每毫秒都在变化。这不是缓存,每次再次调用此调用以将相同的图像加载到其他视图(并且超过毫秒)时,图像都会再次从服务器获取。
      【解决方案4】:

      挣扎了几个小时后,我找到了解决方案。您可以通过添加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

      【讨论】:

      • 如果文件被缓存后超过毫秒,这只是缓存失效。最好不要缓存。
      【解决方案5】:

      添加

      签名(new 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)
      

      【讨论】:

      • 如果文件被缓存后超过毫秒,这只是缓存失效。最好不要缓存。
      【解决方案6】:

      我使用了一种解决方法,因为没有其他方法适合我

      就我而言,我知道当服务器上的图像发生变化时,我只是在 url 的末尾添加?=,对于 glide,它将是一个新的 url,而不是使用缓存 Glide 将加载新的图片。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        相关资源
        最近更新 更多