webentwicklung-frage-antwort-db.com.de

OutOfMemoryError: Bitmap-Größe überschreitet VM Budget: - Android

Mögliches Duplikat:
Android: Merkwürdiges Speicherproblem beim Laden eines Bildes in ein Bitmap-Objekt

ich lade Bilder von der URL herunter und zeige sie an. Zum Zeitpunkt des Downloads gibt es out of memory error : bitmap size exceeds VM budget. Ich benutze Drawable. Code ist unten:

HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();

Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();

Hier ist der Fehler: 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): Java.lang.OutOfMemoryError: bitmap size exceeds VM budget

59
Andy

Verwenden Sie decodeStream(is, outPadding, opts) mit

BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024]; 
31
Sando

Sie können die Bildgröße überprüfen und sie dann um einen geeigneten Faktor verkleinern.

Siehe diese Frage: mgang mit großen Bitmaps

5
Samuh

Dieses Problem scheint mehrmals gemeldet worden zu sein, hier und hier zum Beispiel ... sorry Shalini, aber wenn es dasselbe Problem ist, scheint es überhaupt keine Lösung zu geben ...

Der einzige Ratschlag von Romain Guy ist weniger Speicher verwenden ...

Also, viel Glück, deine Sachen anders zu denken ...

2
Sephy

Nachdem Sie das Bild wie oben vorgeschlagen erneut abgetastet haben, können Sie bitmap_file.recycle () aufrufen.

1
Rorist

Ich habe viele Dinge ausprobiert, das funktioniert.

BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;        
opts.inScale=8;
///after you use your images
System.gc();
0
Thefirstkilla

Die Tatsache ist, dass es einen Fehler bei einigen Android) Versionen gibt, insbesondere bei Version 2.1, der bei Problemen wie diesem die ganze Zeit fehlschlägt.

Ich habe eine App veröffentlicht, in der ich sehr auf die Ressourcennutzung geachtet habe. Ich habe sogar viele Bitmaps gelöscht, die ich verwendet habe, und jetzt werden sie mit grafischen Grundelementen im laufenden Betrieb erstellt. Ich recycle auch Bitmaps, wenn ich sie nicht benutze. Und natürlich habe ich überprüft, dass meine App keine Speicherverluste aufweist: Der verwendete Speicher wächst NICHT ohne Kontrolle, sondern hält die gesamte Zeit in einem vernünftigen Rahmen.

Obwohl ich viel Mühe darauf verwendet habe, dieses Problem zu vermeiden, treten bei 2.1- und 2.1-update1-Geräten immer wieder ärgerliche Ausnahmen auf. Ich benutze jetzt Kriterium, um Abstürze zu melden, und ich habe gesehen, dass es auch dann auftritt, wenn die App nur 4 MB RAM verwendet, viermal weniger als die 16 MB Heap-Größe, die jedes Gerät Android=) hat Muss für eine App haben - und die Tatsache ist, dass die meisten Geräte heutzutage Heap-Größen größer als 16 MB haben -.

Alle meine Bitmaps haben eine Größe von 800 x 480 Pixeln. Im schlimmsten Fall kann ARGB_8888 nicht mehr als 1,5 MB pro Bit belegen, aber der Versuch, eine zu laden, stürzt ab, wenn nur 4 MB belegt sind. Daher sollten mindestens weitere 12 MB vorhanden sein kostenlos. Und die meisten meiner Bitmaps sind als ARGB_4444 geladen, das die Hälfte des Speichers belegt. Ich verwende ARGB_8888 nur, wenn die Bitmaps mit 4444 wirklich schlecht aussehen.

Für mich ist es ziemlich klar, dass auf diesen Android) -Versionen etwas nicht funktioniert. 99'9% dieser Abstürze sind auf das 2.1- und 2.1-Update zurückzuführen, der Rest ist möglicherweise erklärt durch andere pünktliche Gründe.

0
Fran Marzoa