0

我遇到了这个奇怪的错误,有些图像像往常一样被缓存,有些则没有,知道为什么吗?两个图像都可以显示并且内存缓存得很好,但是在离线时会显示一些错误图像。

例如,这很好用: 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,所以缓存说它没有位图然后继续再次下载它,并在离线时失败,奇怪

4

2 回答 2

1

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

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

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

如果您想更改默认行为,我不确定,但我认为您必须稍微编辑代码。

查看 Volley 源代码中的 CacheDispatcher 类。

希望有帮助。

于 2013-08-01T08:00:09.383 回答
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);
    }
}
于 2013-08-20T14:11:20.273 回答