繁体   English   中英

Android凌空图像缓存问题

[英]Android volley image caching questions

在谷歌自己的凌空图像缓存教程中

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

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

谢谢你的帮助。 :)

1.)Volley中有两层缓存,一个是内存缓存(在RAM中),另一个是磁盘缓存。 一旦缓存已满,当将要缓存新图像以为新项目腾出空间时,将清除该缓存中最旧的图像(意味着未访问最长的图像)。 当从内存缓存中清除某些内容时,它仍然存在于磁盘缓存中,并且如果再次需要,可以非常快速地从磁盘加载。 如果从磁盘缓存中清除映像,则必须重新加载它,如果需要再次加载。

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

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

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

申请图片

ImageRequest - 一个罐装请求,用于获取给定URL的图像并使用解码的位图进行回调。 它还提供了便利功能,例如指定要调整大小的大小。 它的主要好处是Volley的线程调度确保在工作线程上自动发生昂贵的图像操作(解码,调整大小)。

因此,如果您仅使用ImageRequest,可以在以下问题中参考我的回答:

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

另外在Google的文档中:

ImageLoader - 一个辅助类,用于处理从远程URL加载和缓存图像。 ImageLoader是大量ImageRequests的协调器,例如在ListView中放置多个缩略图时。 ImageLoader提供了一个内存缓存,可以放在普通的Volley缓存之前 ,......

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

在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) {
        }
    });

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM