Bitmap.createBitmap(int,int,Bitmap.Config)在类通胀期间抛出运行时异常

时间:2011-07-04 11:15:17

标签: java android exception bitmap

我正在尝试在Android中扩展可扩展的图像查看器以并排使用两个图像。为此,我使用Bitmap.createBitmap(int, int, Bitmap.Config)。不幸的是,这似乎正在崩溃虚拟机。

代码是

    protected void combineBitmaps() {
        image0Width = bitmap0.getWidth();
        image0Height = bitmap0.getHeight();
        image1Width = bitmap1.getWidth();
        image1Height = bitmap1.getHeight();

//These methods just get correct values for image[0|1][Width|Height].
        int width = getCanvasWidth();
        int height = getCanvasHeight();

//THIS LINE CRASHES
        Bitmap bitmap_tmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        bitmap = bitmap_tmp;

        Canvas combination = new Canvas(bitmap);

        combination.drawBitmap(bitmap0, 0f, getImage0VertOffset(), null);
        combination.drawBitmap(bitmap1, image0Width, getImage1VertOffset(), null);
    }

我从getCanvasWidth()得到的值是2464,而来自getCanvasHeight()的值是2048.我得到的例外是

Unable to start activity ComponentInfo{com.tse.scview/com.tse.scview.ScalableViewWrapper}: android.view.InflateException: Binary XML file line #8: Error inflating class com.tse.scview.ScalableFacingPageView

其中com.tse.scview.ScalableFacingPageView是我们正在构建的类(构造函数调用此函数)。

我已经从这一行中隔离了所有内容 - 将位图分配给类位图,获取宽度和高度函数等 - 以确定它实际上是导致问题的Bitmap.createBitmap。不幸的是我无法解决问题所在。

更新:作为一个完整性检查,我为宽度和高度设置了较小的值(12和13 ......为什么不呢)。它现在有效。所以这是一个RAM问题,这对我们来说很痛苦,但有效地回答了这个问题。

2 个答案:

答案 0 :(得分:1)

如果我正在正确阅读您的代码和问题,则位图为2464 x 2048 x 4字节。那是16兆字节。而你正在创造其中两个。那是32兆字节。

答案 1 :(得分:0)

我已经读过,如果你使用OpenGL纹理,你可以为Bitmaps分配更多的内存,因为这不计入Android每个app限制的最大内存。另一种方法是在ndk中分配内存,这也不计入Android每个应用限制的最大内存。