有效地设置Android View背景图像会产生java.lang.OutOfMemoryError

时间:2015-10-18 11:48:01

标签: java android bitmap background drawable

在将背景图像设置为Android视图(API 22)的过程中,我遇到了一些问题。

我的图片是1MB .jpeg文件,4000x2672。

起初我尝试通过

PRODUCT

方法,获取 D / skia:---分配位图 错误的分配失败。

然后我跟着http://developer.android.com/training/displaying-bitmaps/load-bitmap.html并按如下方式实施:

BitmapDecoder.java

android:background="@drawable/your_image"

}

SplasActivity.java(主要活动)

(..omissis..)
public class BitmapDecoder {

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {

    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                     int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

我正在获取设备屏幕的WxH,将Drawable资源的大小调整为该大小,将生成的Bitmap转换为Drawable,将Drawable设置为View背景。

但我总是得到

  

D / skia:---为缩放位图分配失败
  ...
  java.lang.OutOfMemoryError:无法分配带有16777120个空闲字节的684032012字节分配和直到OOM的227MB

错误。

我现在一直在寻找几个小时并且没有运气实施所有建议的技术。

作为旁注,如果我将宽度和高度设置为非常小的值(例如400x200),则可行。但是,正如您可能想象的那样,这是不可行的。

关于如何解决的任何想法?

2 个答案:

答案 0 :(得分:3)

根据您的号码判断您将jpeg放在res/drawable文件夹中与res/drawable-mdpi相同,解决方法是将其放入res/drawable-nodpi文件夹

答案 1 :(得分:0)

我认为问题在于您以压缩的jpeg格式(1MB)评估图像大小,但是当您加载它并操作到您的软件时,它将以其位图形式解压缩。

正如您提到的链接中所述: “......较低分辨率的版本应该与显示它的UI组件的大小相匹配。具有更高分辨率的图像不会提供任何明显的好处,但仍会占用宝贵的内存,并且由于额外的动态而导致额外的性能开销缩放。 ..“

您正在使用4000x2672 = 10688000像素的图像,并且每个像素需要多个字节来编码颜色,因此相当于684032012分配的字节。

我可以给出的唯一建议是评估您想要显示图像的大屏幕是什么,检查它的定义并重新缩放图像以便最多匹配该值。