从Glide库中的缓存中删除图像

Nit*_*tri 55 android caching android-glide

我在我的一个项目中使用Glide来显示文件中的图像.

下面是我的代码如何显示图像:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .into(mImage);
Run Code Online (Sandbox Code Playgroud)

此位置(imagePath)的图像不断变化.默认情况下,滑动缓存它在中显示的图像ImageView.因此,Glide正在缓存中显示该位置新图像的第一张图像.

如果我imagePath使用具有相同名称的其他图像更改位置处的图像,则Glide将显示第一个图像而不是新图像.

两个查询是:

  1. 是否可以始终从文件中的图像而不是缓存?这样问题就解决了.

  2. 在获取新替换的图像之前,是否可以从缓存中清除图像?这也将解决问题.

Nit*_*tri 119

这就是我解决这个问题的方法.

方法1:每当图像更改时URL都会更改

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);
Run Code Online (Sandbox Code Playgroud)

diskCacheStrategy()可用于处理磁盘缓存,您可以使用skipMemoryCache()方法跳过内存缓存.

方法2:但是,当URL未更改时,图像会更改

如果您的URL保持不变,则需要使用签名进行图像缓存.

Glide.with(yourFragment)
     .load(yourFileDataModel)
     .signature(new StringSignature(yourVersionMetadata))
     .into(yourImageView);
Run Code Online (Sandbox Code Playgroud)

Glide signature()使您能够将其他数据与缓存键混合使用.

  • MediaStoreSignature如果要从媒体商店获取内容,则可以使用.MediaStoreSignature允许您将日期修改时间,mime类型和媒体商店项目的方向混合到缓存键中.这三个属性可靠地捕获编辑和更新,允许您缓存媒体商店大拇指.
  • 您也可以StringSignature将保存为文件的内容混合文件日期修改时间.

  • 请注意,使用Glide v4`StringSignature`已被`ObjectKey`替换,请参阅[Glide v4 Caching](https://bumptech.github.io/glide/doc/caching.html#custom-cache-invalidation) (4认同)
  • 您没有解决第二个问题“在获取新替换的图像之前是否可以从缓存中清除图像?这也将解决问题。” (3认同)

Mat*_*ini 48

正如Glide wiki的缓存和缓存失效一节中所述:

因为文件名是散列键,所以没有什么好方法可以简单地删除磁盘上与特定URL或文件路径对应的所有高速缓存文件.如果您只被允许加载或缓存原始图像,问题会更简单,但由于Glide还会缓存缩略图并提供各种转换,每个转换都会在缓存中生成一个新文件,跟踪并删除每个缓存版本图像很难.

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

由于您无法更改文件路径,因此Glide提供了signature() API,允许您将一些其他数据混合到内存和磁盘缓存键中,从而允许调用者更好地控制缓存数据何时失效.

如果要在每次从磁盘映像重新加载时,可以像这样更改代码:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(mImage);
Run Code Online (Sandbox Code Playgroud)

  • 对于 Kotlin 使用 `.signature(ObjectKey(System.currentTimeMillis())))` (2认同)

Ana*_*ani 29

这将删除Glide存储的缓存内存.它应该在后台完成,否则会抛出异常

new Thread(new Runnable() {
          @Override
          public void run() {
             Glide.get(MainActivity.this).clearDiskCache();
          }
     }).start();
Run Code Online (Sandbox Code Playgroud)


Cha*_*san 29

有两种方法可以处理Glide缓存刷新,

第一道: - 在下面添加滑行实施

.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
Run Code Online (Sandbox Code Playgroud)

第二种方式:

如果您能够识别图像更改,请在下面提供新文件名,

.signature(new StringSignature(String.valueOf(fileName)))
Run Code Online (Sandbox Code Playgroud)

或者您想每次加载最新图像,请在下方使用

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


And*_*lov 19

有Glide 4.2.0的麻烦,StringSignature没有解决.

看起来StringSignature不再可用,你必须使用ObjectKey.

所以代码看起来像

Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);
Run Code Online (Sandbox Code Playgroud)


Dhi*_*pta 15

如果将图像保存为与约定相同的已知文件名,并且只有在文件更改时才想使Glide缓存无效,则使用文件修改时间戳可以很好地工作.

我正在使用这样的惯性图像,我正在下载到FileGlide外的对象,然后使用Glide只是为了有效地调整大小并使它们成为圆形等.

所以我最终使用StringSignature策略将文件的lastChanged时间戳的值作为签名.这是流畅的代码:

Glide.with(this)
        .load(avatarFile)
        .diskCacheStrategy(DiskCacheStrategy.RESULT)
        .signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
        .into(ivProfile);
}
Run Code Online (Sandbox Code Playgroud)

当然,avatarFile我的java.io.File对象在哪里.


Pal*_*dro 12

我使用Glide版本4.*与Kotlin设置签名时遇到了麻烦.过了一段时间我最终得到了这个:

fun ImageView.loadUrl(url: String) {
    var requestOptions = RequestOptions()
    requestOptions.signature(ObjectKey(System.currentTimeMillis()))
    Glide.with(this).load(url).apply(requestOptions).into(this)
}
Run Code Online (Sandbox Code Playgroud)

它是ImageView的扩展函数,它以这种方式使用:

 imageView.loadUrl(url)
Run Code Online (Sandbox Code Playgroud)

我希望它会帮助某人


Jay*_*ala 11

对于Glide 4.3.+库,你需要这样的东西,

Glide.with(context)
    .load(image_path)
    .apply(new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true))
    .into(imge_view);
Run Code Online (Sandbox Code Playgroud)


Vin*_*ohn 9

在最新版本中,我们应该使用RequestOptions

RequestOptions提供类型无关的选项,以在最新版本的Glide中使用Glide自定义负载.

创建一个RequestOptions对象,并在我们加载图像时使用它.

 RequestOptions requestOptions = new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
                        .skipMemoryCache(true);

 Glide.with(this)
           .load(photoUrl)
           .apply(requestOptions)
           .into(profile_image);
Run Code Online (Sandbox Code Playgroud)


The*_*Rex 7

我为此工作了好几天,所有上述解决方案都像树懒一样慢。

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

从滑行:

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

解决方案: 当用户上传新图像时更改图像的名称。获取文件名并使用它作为示例。一旦图像 URL 发生变化,Glide 就会知道您已经更改了图像,并将相应地更新缓存。到目前为止,这给了我最好的表现。

使用时:

.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
Run Code Online (Sandbox Code Playgroud)

它从不缓存图像,这确实使图像加载缓慢。您可能认为签名的性能更好,但对我来说它们似乎同样慢。


Dan*_*anu 5

使用GlideApp签名

    GlideApp.with(imageView)
            .load(url)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .placeholder(R.drawable.sky)
            .error(R.drawable.sky)
            .into(imageView);
Run Code Online (Sandbox Code Playgroud)


Eug*_*noy 5

最后是 Kotlin 实现(对于片段):

Glide.with(activity)
            .load(url)
            .apply(RequestOptions()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .skipMemoryCache(true))
            .into(myImageView)
Run Code Online (Sandbox Code Playgroud)


Ada*_*hns 5

我正在使用 Glide 加载一个File,这是我最终做的事情,以确保每次我的文件更改时 Glide 的磁盘缓存都无效(即使它具有相同的路径):

Glide.with(context)
    .load(bitmapFile)
    .signature(new ObjectKey(bitmapFile.lastModified()))
    .into(imageView);
Run Code Online (Sandbox Code Playgroud)