android volley 将自动调整(子样本)大图像的大小

android volley will resize(subsample) large images automatically

在我的应用程序中,我必须从我的服务器下载高分辨率图像。我打算使用截击。图片加载对于小 images.for 一些高分辨率图片效果很好,它会抛出内存不足异常。 我已经用一些示例图像进行了测试,它会抛出一些图像的内存不足异常。我还看到了关于对大图像进行子采样以在此 link loading large images efficiently 中有效显示的内容。我不知道它会自动降低高分辨率图像的图像分辨率。

使用 volley 将图像加载到图像视图中的代码。

imgloader_disk.get(url, new ImageListener() {

        @Override
        public void onErrorResponse(VolleyError error) {


        }

        @Override
        public void onResponse(ImageContainer response, boolean arg1) {
            if (response.getBitmap() != null) {
                mImageView.setImageBitmap(response.getBitmap());

            }
        }
    });

你的服务器不能有大尺寸的图像,无论你使用什么库你无论如何都会有 Out of memory exception因为任何 android 应用程序的默认堆大小是有限的,即 16MB .一旦你消耗了那个堆大小,无论你增加它还是不增加它,你肯定会遇到内存不足异常。所以不建议在服务器上使用高分辨率的图片。

添加

android:largeHeap="true"

在你的 AndroidManifest.xml

我假设您正在使用 ImageLoader 对象来启动请求以获取您需要的图像。

ImageLoader.get() 有一个重载方法,它接受 maxWidth / maxHeight 参数,你应该 always 使用(除非你知道你正在获取的图像是大小合理):

 public ImageContainer get(String requestUrl, ImageListener imageListener, int maxWidth, int maxHeight, boolean withCache)

您可以使用 ImageView 显示图像的尺寸,或者 - 如果您不知道尺寸 - 您应该使用 width/height 屏幕。

传递这些变量后,Volley 将通过将图像缩小到不超过所需大小来处理其余的事情。

请记住,与 iOS 不同,Android 对您在应用程序中分配的内存有很大限制,这在位图上尤其普遍。您必须尽一切努力只分配您需要的资源,并在您不再需要时释放资源。