C89-HD C89-HD - 11 months ago 60
Java Question

crash application when starting new Activity with large background

when i try to click on button to move to the second Activity the app crash (unfortunately app has stopped ). The main Activity and the second Activity was created with a background image.

I have tried to delete the backgrounds and replace it with mipmap so the app run very well without crashing. I don't know why ?
PS: the size of backrounds jpg = 70kb and 80 kb.

look at the java main & drawable folder

hqt hqt
Answer Source

As you described, I guess the exception is OutOfMemory exception. This is a well-known issue when you load a large image into activity. You should scale that image down before loading into ImageView

Here is the sample code getting from Loading Large Bitmaps Efficiently

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);