我在保存图像文件,更新图像文件并通过Gilde库将其加载到ImageView时遇到了一些问题。
基本上我写了一个名为 tmp_photo.jpg 的文件直接写入缓存。 我覆盖了这个文件,以便我将来不需要清理多个文件。
这是第一次一切正常,ImageView中显示正确的图像。 第二次,即使我已经覆盖了文件并且应该加载一个新图像,旧的图像也会显示在ImageView中。
这是我显示图像的方式:
Glide.with(getActivity())
.load(filePath)
.error(R.drawable.error_holder)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(ivDisplayPhoto);
如果我使用任何文件资源管理器应用程序导航到该文件,该文件将更新,我可以在打开文件时实际看到新照片。我注意到的一件事是缩略图没有更新,但我并不关心它,因为我没有直接使用它。
任何人都可以帮我理解发生了什么吗?谢谢。
LE
我设法通过一个小技巧来避免这种情况,但我认为这不是最佳解决方案。我还在寻找如何直接与Glide一起做这件事。这就是我现在所做的:
// Invalid what was previously shown in the ImageView
ivDisplayPhoto.setImageURI(null);
ivDisplayPhoto.invalidate();
// Hide the progress & display the image
UiUtils.crossFade(ivDisplayPhoto, imageProgress);
livecastCover.post(new Runnable() {
@Override
public void run() {
ivDisplayPhoto.setImageURI(fileUri);
}
});
我直接使用了Uri,而不是String path。
答案 0 :(得分:1)
我可以通过在使用Glide时向缓存添加签名来解决此问题。显示基于保存文件的uri将签名设置为某些内容的示例适用于我(您的可能需要有所不同):
Glide.with(context.getApplicationContext())
.using(new FirebaseImageLoader())
.load(storageReference)
.signature(new StringSignature(uri.toString()))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(placeHolder)
.into(imageView);
} catch (IllegalArgumentException e) {
Timber.e(e);
}
答案 1 :(得分:0)
我不知道您的特定图像缓存库。 但大多数情况下,除了将图像保存到磁盘之外,它还会将图像保留在内存中。
这样做是因为它在内存中读取比在磁盘上读取更快,并且新加载的图像很可能会重复使用(例如:滚动列表时)。既然你给了相同的名字/网址,它认为它是相同的图像。
因此,您需要清除/禁用内存缓存(错误)或为图像指定不同的名称。
编辑:为什么你只想在缓存中保留一个图像? Glide将自动处理旧文件的删除,这就是这些库的重点,让您的生活更加轻松!