Bitmap.createBitmap (int, int, Bitmap.Config) генерирует исключение времени выполнения во время инфляции класса - PullRequest
2 голосов
/ 04 июля 2011

Я пытаюсь расширить масштабируемое средство просмотра изображений в 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 ... ну почему бы и нет). Теперь это работает. Так что это проблема с оперативной памятью, которая причиняет нам боль, но эффективно отвечает на вопрос.

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Если я правильно читаю ваш код и вопрос, битовая карта составляет 2464 x 2048 x 4 байтаЭто 16 мегабайт.И вы создаете два из них.Это 32 мегабайта.

0 голосов
/ 16 июля 2012

Я читал, что вы можете выделить больше памяти для растровых изображений, если вы используете текстуру OpenGL, поскольку это не учитывает ограничение максимальной памяти на Android в приложении.Другим способом является выделение памяти в ndk, что также не учитывает ограничение максимальной памяти Android на приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...