我有一个应用程序,可以在列表视图中的每个项目上加载图像,我使用volley使我的生活更轻松;如果以前已经下载过,我需要从磁盘加载图像。
问题:这行不通。它需要重新下载所有的图像。我需要保存图像,即使我退出应用程序。
奇怪:它只对一个特定的图像起作用(与大小无关)!
我用的是:我用这个网站的模式:https://github.com/rdrobinson3/VolleyImageCacheExample
我也试过这个:http://howrobotswork.wordpress.com/2013/06/02/downloading-a-bitmap-asynchronously-with-volley-example/
代码:

String godzilla = "http://vineland.pynchonwiki.com/wiki/images/c/cf/Godzilla.jpg";

//String meme = "http://upload.wikimedia.org/wikipedia/en/d/d7/Meme_Many_Journeys.jpg";
ImageCacheManager.getInstance().getImageLoader().get(godzilla, new ImageLoader.ImageListener() {
    @Override
    public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
           viewHolder.backgroundImage = imageContainer.getBitmap();
           updateBackgroundImage(viewHolder,  viewHolder.backgroundImage, object);
           updateLayoutAlignmentParams(viewHolder);
    }

    @Override
    public void onErrorResponse(VolleyError volleyError) {

    }
});
if(viewHolder.backgroundImage != null)
    updateBackgroundImage(viewHolder, viewHolder.backgroundImage, object);

我试过meme网站,但仍然有问题。我有一个特别的网站,其中包含一个奇怪的工作图像。更让人困惑。
edit:附加信息,似乎在将lruentries添加为lruentries.remove时出错(在completedit()上调用entry.key)。

最佳答案

当涉及到图像时,Volley有两个缓存层:
l1级:由您在ImageLoader构造函数中提供的内存缓存。
二级缓存:在同一个RequestQueue执行的每个请求之间共享的磁盘缓存。
磁盘缓存缓存每个响应,除非请求明确请求不缓存。但是,缓存是根据响应的http缓存头执行的。
当您请求图像时,这就是截击的作用:
检查图像的一级缓存。如果找到,请返回。
图像不在内存中-检查二级缓存。如果找到,请检查缓存头的过期时间。如果仍然有效,则添加到一级缓存并返回图像。
映像不在磁盘上(不在磁盘上或已过期)-执行网络请求。在磁盘缓存中缓存响应,在内存缓存中缓存位图并返回。
我敢打赌从磁盘加载的图像有缓存头。
IMO,你有三个选择:
映像服务器是您的-添加适当的缓存头。
图像服务器不是你的-接受一些图像不会缓存在磁盘上的事实。
重写缓存策略以更好地满足您的需要。这意味着编辑截击源代码。

关于android - 使用DiskBasedCache时未加载Android Volley ListView图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23737960/

10-10 18:28
查看更多