2013-07-01 41 views
0

我遇到了这个奇怪的错误,其中一些图像像往常一样缓存,有些不,为什么? 这两个图像都显示并缓存内存很好,但离线时显示一些错误图像。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犯规

..both做工精细显示和memcaching但第二次犯规获得从磁盘缓存显示,altough我想我看到它被保存,因为应用程序说,它有12KB缓存在系统设置中

谢谢!

//编辑 我签出了一份齐立的干净副本,它也做同样的事情。它的definatelly一个bug ... 从我发现它的图像得到缓存,但Bitmap cachedBitmap = mCache.getBitmap(cacheKey);总是返回null,所以缓存表示它没有位图,然后程序再次下载,并在离线时失败,很奇怪

+0

我检查了排球的干净副本,并将其做同样的事情。它的definatelly一个bug ... – urSus

+0

不,我没有检查第二张图片的标题,但也许它没有缓存,因为它从svg产生 – Selvin

+0

这个怎么样? http://freesummer.sk/files/201106/thumb/big/images.jpg http://freesummer.sk/files/201106/thumb/big/fs2007_logo.jpg这实际上是从我的项目 – urSus

回答

1

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

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

如果您想要使用默认设置,则图像必须具有Cache-Control标头,如max-age = ???问号表示从下载时间开始有足够的秒数。

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

查看Volley源中的CacheDispatcher类。

希望有所帮助。

+0

是的,你说得对。 – urSus

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); 
    } 
} 
相关问题