【问题标题】:Android Universal Image Loader: by-pass disc/memory cache check when loading an image?Android Universal Image Loader:加载图像时绕过磁盘/内存缓存检查?
【发布时间】:2014-03-24 13:34:43
【问题描述】:

该库仅公开了在显示选项中启用/禁用缓存的选项。有没有办法在加载图像时避免磁盘或内存缓存检查?

我的问题是库总是先检查磁盘缓存。我的磁盘缓存设置为小缩略图大小。当我需要加载屏幕大小的图像时,我无法跳过磁盘缓存,它总是让我得到较低分辨率的图像。

【问题讨论】:

  • 缩略图和全尺寸图片的 URL 相同吗?
  • @NOSTRA 嗨,感谢您的出色图书馆。我使用 UIL 进行本地图像缓存。我的用法在这里描述:stackoverflow.com/q/19995007/727768我在文件系统上有所有本地图像,但它们很大,所以我想在网格视图中使用磁盘缓存来获取微小的缩略图。 (InSampleSize 选项有助于内存占用,但加载过程必须扫描几个 MB 磁盘)
  • @NOSTRA 有一个带有 ImageSize 选项的 loadImage,但库不尊重这一点,它会获取磁盘缓存版本,无论它是什么大小。
  • 如果 UIL 内存可以进行多种大小的缓存,最好将其扩展到磁盘缓存,可能默认关闭。这对于想要进行多级缩略图缓存的人来说非常有用。
  • 好的,我了解你的情况。

标签: android universal-image-loader


【解决方案1】:

UIL 总是在显示之前检查缓存。因此,如果不更改来源,就无法避免。

但我认为您可以通过扩展磁盘缓存来解决您的问题。目标是在您要加载全尺寸图像时从 get() 方法返回不存在的文件。 所以你应该像往常一样加载缩略图。当您需要显示全尺寸图像时,您应该在显示选项 (DisplayImageOptions) 中禁用磁盘缓存,然后执行以下操作:

((MyDiscCache) imageLoader.getDiscCache()).setIgnoreDiskCache(true);

所以你的缓存必须返回任何不存在的文件(但不能为空)。

当您返回显示缩略图时,您应该“启用” (setIgnoreDiskCache(false)) 磁盘缓存。

更新: 创建您自己的磁盘缓存并将其设置为 config。

public class MyDiscCache extends UnlimitedDiscCache {

    private boolean ignoreDiskCache;

    public MyDiscCache(File cacheDir) {
        super(cacheDir);
    }

    public MyDiscCache(File cacheDir, FileNameGenerator fileNameGenerator) {
        super(cacheDir, fileNameGenerator);
    }

    @Override
    public File get(String key) {
        if (ignoreDiskCache) {
            return new File("fakePath");
        } else {
            return super.get(key);
        }
    }

    public void setIgnoreDiskCache(boolean ignoreDiskCache) {
        this.ignoreDiskCache = ignoreDiskCache;
    }
}

【讨论】:

  • 谢谢,我试试看。将来,您认为是否值得添加以下功能: 1. 绕过磁盘和/或内存缓存检查的选项。 2. 请求特定大小的选项,如果缓存大小较小,则从原始文件加载。 3.在磁盘上缓存多种尺寸,就像内存缓存一样。 (再次感谢您提供这个出色的库。我在我的 iOS 应用上使用 SDWebImage,现在正在将该应用移植到 Android。我首先尝试了 Picasso,但它在很多方面都受到限制。)
  • 我又看了一遍,你的建议不起作用。 DiscCache 接口仅使用字符串键参数指定 get()。我无法通知实现以不同的方式表现。我不能将特殊字符串放在键中,这也会影响其他事情。
  • 您的网址应该相同。您只需要打开/关闭磁盘缓存。更新了答案。
  • 感谢您的回答!顺便说一句,“磁盘”应该真的是“磁盘”support.apple.com/kb/ht2300 :)
  • 是的,我知道 :) 这是历史错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多