Android 排球图像缓存问题

Android volley image caching questions

在google自己的凌空图片缓存教程

// 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);

我的第三个问题有很多克隆问题,但其中 none 个已得到解答。

感谢您的帮助。 :)

1.) Volley 中有两层缓存,一层是in-memory 缓存(在RAM 中),另一层是磁盘缓存。一旦缓存已满,当要缓存新图像以为新项目腾出空间时,该缓存中最旧的图像(即未被访问时间最长的图像)将被逐出。当某些东西从 in-memory 缓存中被逐出时,它仍然存在于磁盘缓存中,并且可以在再次需要时从磁盘中快速加载。如果一个图像从磁盘缓存中被逐出,如果再次需要它就必须重新下载。

2.) 一旦您理解了问题 1 的答案,这听起来就不合理了。缓存会自动为更新的内容腾出空间,没有理由手动清除内容。手动逐出实际上会降低缓存的效率。

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

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

Request an Image

ImageRequest—a canned request for getting an image at a given URL and calling back with a decoded bitmap. It also provides convenience features like specifying a size to resize to. Its main benefit is that Volley's thread scheduling ensures that expensive image operations (decoding, resizing) automatically happen on a worker thread.

所以如果你只使用ImageRequest,你可以参考我在以下问题的回答:

也在 Google 的文档中:

ImageLoader—a helper class that handles loading and caching images from remote URLs. ImageLoader is a an orchestrator for large numbers of ImageRequests, for example when putting multiple thumbnails in a ListView. ImageLoader provides an in-memory cache to sit in front of the normal Volley cache,...

如果你使用NetworkImageView,可以参考我在以下问题的回答:

其中你会发现我在VolleySingleton里面使用了下面的代码class:

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

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

希望对您有所帮助!