Android Volley - 一些光盘缓存的图像不显示?

时间:2013-07-01 17:45:51

标签: android image-caching android-volley

我遇到了这个奇怪的错误,其中一些图像像往常一样被缓存而有些不,任何想法为什么? 两个图像都显示出来并且内存缓存得很好,但是当离线时,一些显示错误图像。

例如http://cs4381.vk.me/u73742951/a_58a41ac2.jpg工作正常 这http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Android_robot.svg/220px-Android_robot.svg.png没有

..两者都工作正常显示和内存缓存,但第二个没有从磁盘缓存显示,尽管我认为我看到它被保存,因为应用说它在系统设置中有12kB缓存

谢谢!

//编辑 我检查了一个干净的Volley副本,它做了同样的事情。它绝对是一个错误...... 从我发现它的图像确实被缓存,但Bitmap cachedBitmap = mCache.getBitmap(cacheKey);总是返回null,所以缓存说它没有位图,然后再次下载它,并在离线时失败,很奇怪

2 个答案:

答案 0 :(得分:1)

您没有获得任何匹配的原因是因为Volley中用于磁盘缓存的默认行为取决于您请求的元素的HTTP标头(在您的情况下是图像)。

检查凌空日志并查看是否收到“缓存命中过期”消息 - 这意味着图像已缓存,但就默认磁盘缓存而言,它的TTL已过期。

如果您希望默认设置有效,则图像必须具有Cache-Control标头,例如max-age = ???问号表示从下载时起的足够秒数。

如果你想改变默认行为,我不确定,但我认为你必须稍微编辑一下代码。

查看Volley源中的CacheDispatcher类。

希望有所帮助。

答案 1 :(得分:1)

快速而肮脏的方式:

private static class NoExpireDiskBasedCache extends DiskBasedCache
{
    public NoExpireDiskBasedCache(File rootDirectory, int maxCacheSizeInBytes)
    {
        super(rootDirectory, maxCacheSizeInBytes);
    }
    public NoExpireDiskBasedCache(File rootDirectory)
    {
        super(rootDirectory);
    }
    @Override
    public synchronized void put(String key, Entry entry)
    {
        if (entry != null)
        {
            entry.etag = null;
            entry.softTtl = Long.MAX_VALUE;
            entry.ttl = Long.MAX_VALUE;
        }

        super.put(key, entry);
    }
}