OutOfMemoryError - bitmap size exceeds VM budget

Keine_Angabe

Keine_Angabe

Ambitioniertes Mitglied
9
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:
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ß.
 
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
 
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
 

Ähnliche Themen

A
  • Arif12
Antworten
7
Aufrufe
1.412
Jaiel
Jaiel
I
Antworten
8
Aufrufe
1.213
IIIGeorgeIII
I
C
Antworten
4
Aufrufe
1.598
swa00
swa00
Zurück
Oben Unten