Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android截击图像缓存问题_Java_Android_Image_Caching_Android Volley - Fatal编程技术网

Java Android截击图像缓存问题

Java Android截击图像缓存问题,java,android,image,caching,android-volley,Java,Android,Image,Caching,Android 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 s

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

// 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);
在我的第三个问题中有很多克隆人的问题,但是没有一个得到回答

谢谢你的帮助。:)

有两层缓存,一层是内存缓存(在RAM中),另一层是磁盘缓存。缓存已满后,当即将缓存新图像以为新项目腾出空间时,缓存中最旧的图像(即未被访问的最长图像)将被逐出。当某些内容从内存缓存中移出时,它仍然存在于磁盘缓存中,如果再次需要,可以非常快速地从磁盘加载。如果将映像从磁盘缓存中移出,则必须重新下载映像(如果再次需要)

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


3.)广义地说,这是不可能的(没有黑客),因为它不应该被需要。如果图像资源(几乎)总是在某一时间后过期,则服务器应在将资源发送到客户端时使用HTTP头声明此消息。例如,使用缓存控件标头的“最大年龄”属性。有很多网站详细解释了这一点,例如:。如果图像资源几乎不会过期,您可以考虑在更改时更改其文件名,并将该文件名存储为属性。例如,用户可以具有包含到化身的URL的化身属性。化身图像可以无限期缓存,如果上传了新的化身,您可以更改图像的URL。

关于第三个问题,我建议您阅读以下谷歌文档:

ImageRequest-在给定URL和 用解码后的位图返回。它还提供了便利 功能包括指定要调整大小的大小。它的主要好处是 Volley的线程调度确保了昂贵的映像操作 (解码、调整大小)自动发生在工作线程上

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

同样在谷歌的文档中:

ImageLoader-处理加载和缓存图像的帮助器类 从远程URL。ImageLoader是一个用于处理大量数据的编排器 ImageRequests,例如,将多个缩略图放入 列表视图。ImageLoader提供了一个内存缓存,可以放在 正常截击缓存

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

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

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

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

希望有帮助

嘿,法比安,非常感谢你完美的回答,现在我明白我该怎么做了。我可以再问一个问题吗?我如何确定项目的最佳缓存大小,就像我在第一篇文章中提到的那样?此外,还有两种类型的图像,一种是原始图像,另一种是预览图像。我应该将这两个视图都添加到数据库中,还是只添加一个原始视图,并通过在应用程序中为我的所有列表视图手动减小宽度和高度来创建预览?非常感谢你。