我遇到了这个奇怪的错误,其中一些图像像往常一样被缓存而有些不,任何想法为什么? 两个图像都显示出来并且内存缓存得很好,但是当离线时,一些显示错误图像。
例如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,所以缓存说它没有位图,然后再次下载它,并在离线时失败,很奇怪
答案 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);
}
}