覆盖文件时从同一文件加载的图像错误

时间:2015-11-27 06:35:34

标签: android file imageview overwrite

我在保存图像文件,更新图像文件并通过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。

2 个答案:

答案 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将自动处理旧文件的删除,这就是这些库的重点,让您的生活更加轻松!