Как преодолеть ошибку OutOfMemory в моем приложении для Android?

Я создаю приложение, которое загружает шесть растровых изображений в качестве фона кнопки, чтобы изменить состояние кнопки, когда пользователь выполняет какие-либо действия над этим, но иногда оно дает ошибку, например

java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины

И я использую следующий метод в MainActivity для установки растрового изображения:

            on_duty.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.on_duty_d));
            off_duty.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.off_duty));
            journey_start.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.journey));
            journey_end.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.destination_d));
            metting_in.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.meeting));
            metting_out.setBackgroundDrawable(GetApplicationDrawable
                    .Button3(R.drawable.over_d));

И мой метод Button3 внутри моего класса GetApplicationDrawable, как показано ниже, для декодирования растровых изображений

public static Drawable Button3(int res_id) {
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeResource(context.getResources(),
                res_id);

    } catch (Exception e) {
        e.printStackTrace();
    }
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    float newWidth = (float) ((float) wt / 3);
    float scaleWidth = ((float) newWidth) / width;
    float newHeight = (float) ((float) wt / 4);
    float scaleHeight = ((float) newHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap mannagedBitmap = bitmapMannagement(context.getResources(),
            res_id, width, height);
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(mannagedBitmap,
            (int) newWidth, (int) newHeight, true);
    Drawable d = new BitmapDrawable(context.getResources(), resizedBitmap);
    return d;
}

Спасибо.


person Ravi Shanker Yadav    schedule 06.09.2014    source источник
comment
Эй, почему это статично? А в верхнем регистре? Я рекомендую вам использовать растровые изображения меньшего размера — насколько они велики? -- и очистите код, который излишне статичен.   -  person 323go    schedule 06.09.2014
comment
Я удалил статику, и проблема осталась прежней.   -  person Ravi Shanker Yadav    schedule 06.09.2014


Ответы (1)


Когда этот код дает сбой, вам нужно выйти из функции или обработать ее корректно.

try {
    bitmap = BitmapFactory.decodeResource(context.getResources(),
            res_id);

} catch (Exception e) {
    e.printStackTrace();
    // here you need to get out of the function 
    // or recover gracefully
    //TODO set the bitmap to a default bitmap.
    //TODO or return a null;
}
person danny117    schedule 06.09.2014