OutOfMemoryError - bitmap size exceeds VM budget

  • 4 Antworten
  • Neuester Beitrag
Diskutiere OutOfMemoryError - bitmap size exceeds VM budget im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Keine_Angabe

Keine_Angabe

Ambitioniertes Mitglied
Hallo,
ich habe einen ViewAnimator, in dem 3 Layouts mit unterschiedlichen Background-Bildern liegen. Nun sind diese Bilder für große Displays gemacht und liegen im xhdpi-Ordner. Sie sind 1280x800px groß und haben jeweils eine Dateigröße von 200KB. Wenn ich das ganze nun in einem Emulator teste, erhalte ich immer folgende Exception:
Code:
GC_EXTERNAL_ALLOC freed 36K, 52% free 3084K/6343K, external 18287K/18460K, paused 50ms
Code:
[FONT=Arial]
[/FONT][FONT=Arial]1366400 [/FONT][FONT=Arial]-byte external allocation too large for this process.
Clamp target GC heap from 24.974MB to 24.000MB
VM won't let us allocate 1366400 bytes
java.lang.OutOfMemoryError: bitmap size exceeds VM budget[/FONT]

Wie kann das sein? Es sind ja insgesamt nur 600KB und den Emulator habe ich auch auf die Auflösung 1280x800 gestellt. Es dürfte also eigentlich nicht viel an den Bildern skaliert werden. Hat jemand eine Idee wie das beheben könnte?
 
Zuletzt bearbeitet:
Thyrion

Thyrion

Ehrenmitglied
Du hältst die Bilder vermutlich als unkomprimierte Bitmaps im Speicher. Da ist ein Bild bei dir bei 32 Bit/Pixel etwa 4 MB groß.
 
Keine_Angabe

Keine_Angabe

Ambitioniertes Mitglied
Ich habe sie lediglich als Background für die Layouts gesetzt. Wenn sie dabei automatisch unkomprimiert im Speicher liegen hast du recht :D
Kannst du mir bitte auch einen Tipp geben wie ich das umgehen könnte?

Grüße
 
Keine_Angabe

Keine_Angabe

Ambitioniertes Mitglied
Ich habe diesen Link befolgt: Loading Large Bitmaps Efficiently | Android Developers aber es gab keine Veränderungen. Es wurden immer noch die gleichen Dateimengen produziert und die Fehlermeldungen kamen deshalb auch noch. Hier mal den Code den ich hinzugefügt habe:

Code:
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);
    }
    
    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) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }
    }
    return inSampleSize;
    }
Aber es muss doch eine Möglichkeit geben mehr als ein Bild gleichzeitig zu laden. Wir leben immerhin im 21. Jahrhundert. Das Problem macht mich echt verrückt. Hat niemand eine Ahnung wie ich das lösen könnte?

Grüße