安卓Volley图片缓存问题

3
在谷歌自己的Volley图像缓存教程中
// Returns a cache size equal to approximately three screens worth of images.
public static int getCacheSize(Context ctx) {
    final DisplayMetrics displayMetrics = ctx.getResources().
            getDisplayMetrics();
    final int screenWidth = displayMetrics.widthPixels;
    final int screenHeight = displayMetrics.heightPixels;
    // 4 bytes per pixel
    final int screenBytes = screenWidth * screenHeight * 4;

    return screenBytes * 3;
}

推荐的缓存大小为三屏幕的图片,相当于7MB。我有一个社交媒体应用程序,其中包含一个新闻源。
1-) 我的第一个问题是缓存满了之后会发生什么?
2-) 我考虑每小时清除一次缓存,这样缓存将包括更新的内容。这种做法合理吗?类似于新闻源(例如Instagram)的应用程序中的图片缓存逻辑是什么?
3-) 如何删除特定项目的旧缓存并强制重新下载?我尝试了这个解决方案,但它没有起作用:
VolleySingleton.getInstance().getRequestQueue().getCache().remove(IMAGE_URL);

mNetworkImageView = (NetworkImageView) getView().findViewById(R.id.networkImageView);
mImageLoader = VolleySingleton.getInstance().getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

我有很多与我的第三个问题相似的克隆问题,但没有一个得到答案。

谢谢你的帮助。 :)

2个回答

1
对于您的第三个问题,我建议您阅读以下 Google 文档:

请求图像

ImageRequest——一个预定义的请求,用于获取给定 URL 的图像并回调解码后的位图。它还提供了方便的功能,如指定要调整大小的尺寸。其主要优点是 Volley 的线程调度确保昂贵的图像操作(解码、调整大小)自动在工作线程上进行。

因此,如果您只使用 ImageRequest,请参考我在以下问题中的答案:

告诉 Volley 不要使用缓存数据而是发起新请求?

同样在 Google 的文档中:

是一个帮助类,负责从远程URL加载和缓存图片。ImageLoader是大量ImageRequest的协调者,例如在ListView中放置多个缩略图时。ImageLoader提供了一个内存缓存来代替正常Volley缓存。如果您使用NetworkImageView,可以参考我在以下问题的答案:

Disable or Remove Cache in NetworkImageView- Volley

其中,您会发现我在VolleySingleton类中使用以下代码:

    mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
        @Override
        public Bitmap getBitmap(String url) {
            return null;
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
        }
    });

希望它有所帮助!

1
1.) Volley有两层缓存,一层是内存缓存(RAM中),另一层是磁盘缓存。一旦缓存满了,在该缓存中最老的图像(即最长时间未被访问的图像)将在新图像要缓存以腾出空间时被驱逐。当从内存缓存中驱逐某些内容时,它仍然存在于磁盘缓存中,如果需要再次加载,则可以从磁盘上快速读取。如果从磁盘缓存中删除图像,则需要重新下载,如果需要再次使用。
2.) 如果您理解了问题1的答案,这听起来并不合理。缓存会自动为较新的内容腾出空间,没有理由手动驱逐内容。手动清除缓存实际上会降低缓存的效率。

3.) 总的来说,这是不可能的(没有黑客技巧),因为它不应该被需要。如果一个图像资源(几乎)总是在一定时间后过期,服务器应该在将资源发送给客户端时使用HTTP头部进行通告。例如,使用缓存控制头的max-age属性。有很多网站详细解释了这一点,例如:http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/。如果一个图像资源几乎永远不会过期,您可以考虑在更改时更改其文件名并将该文件名存储为属性。例如,用户可以拥有一个包含头像URL的头像属性。头像图像可以无限期地缓存,并且如果上传了新头像,则更改图像的URL。


嘿,Fabian,非常感谢您的完美答案,现在我明白了如何做。如果可以的话,我可以再问一个问题吗?对于像我在第一篇帖子中提到的项目,我该如何决定最佳缓存大小?此外,有两种类型的图像,一种是原始图像,另一种是预览图像。我应该将它们都添加到数据库中,还是只添加原始图像并通过在应用程序中手动减小宽度和高度来创建所有列表视图的预览? 非常感谢。 - shanks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接