BitmapFactory.decodeStream(memory leak)

  • 11 Antworten
  • Neuester Beitrag
Diskutiere BitmapFactory.decodeStream(memory leak) im Android App Entwicklung im Bereich Betriebssysteme & Apps.
M

mr.freeze

Ambitioniertes Mitglied
Hallo,
ich lade über urls bilder in eine liste.
wenn ich dann auf einen listeneintrag klicke soll das dazugehörige
bild in einer neuen View angezeigt werden.

ich bekomme leider wegen der "BitmapFactory.decodeStream()"
folgende fehlermeldung:
"java.lang.OutOfMemoryError: bitmap size exceeds VM budget"

gibt es noch eine andere möglichkeit bilder von einer url zu beziehen?
oder eine möglichkeit den fehler zu beheben oder zu umgehen?

Gruß
 
C

computer_freak

Fortgeschrittenes Mitglied
Du musst einfach nur lesen was da steht, mehr können wir auch nicht.
Wenn es nicht klappt, zieh ein englischwörterbuch zur Hilfe!
 
M

mr.freeze

Ambitioniertes Mitglied
lol

das sagt mir, dass du das problem nicht kennst!

und davon auszugehen, dass man das nicht übersetzen kann,
find ich naja....
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Cached du die Bilder ?

Oder ziehst du sie erneut vom Netz wenn du auf den List Eintrag drückst
 
M

mr.freeze

Ambitioniertes Mitglied
Ich hole sie wieder.

Weiß noch nicht genau, ob ich sie in eine Datenbank speichern werde
oder nicht!
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Genau da wird dein Problem sein, Cache sie beim erstenmal auf die SD Karte oder irgendwo hin.

Und ab dann nimmst sie daraus ist denk ich auch besser wegen Traffic etc
 
M

miha

Erfahrenes Mitglied
mr.freeze schrieb:
ich bekomme leider wegen der "BitmapFactory.decodeStream()"
folgende fehlermeldung:
"java.lang.OutOfMemoryError: bitmap size exceeds VM budget"
Meistens ist Speicher schon eigentlich genug vorhanden - nur noch nicht freigegeben.
Öfter mal System.gc() aufrufen um garbage collection zu erzwingen hilft da (besonders beim Laden von vielen Bildern). Außerdem musst du mal gucken ob du nicht mehr benötigte Bitmaps auch alle korrekt recycle()st ...

Wenn das nichts hilft und die Bilder wirklich zu groß sind (unwahrscheinlich eigentlich!) dann kannst du beim decode noch in den opts angeben dass kleingesamplet werden soll.
 
M

miha

Erfahrenes Mitglied
v Ralle v schrieb:
Äh, das ist doch genau was ich geschrieben habe falls wirklich kein Speicher da ist ...

Und ich habe gerade zwei Tage mit dem Problem verbracht hunderte Bilder mit bis zu mehreren MB Größe pro Bild zu laden und NIE war nicht genug Speicher da so dass runtergesamplet werden musste! Hab den Code nur noch zu Notlösung drin ...
 
Zuletzt bearbeitet:
v Ralle v

v Ralle v

Stammgast
miha schrieb:
Äh, das ist doch genau was ich geschrieben habe falls wirklich kein Speicher da ist ...

Und ich habe gerade zwei Tage mit dem Problem verbracht hunderte Bilder mit bis zu mehreren MB Größe pro Bild zu laden und NIE war nicht genug Speicher da so dass runtergesamplet werden musste! Hab den Code nur noch zu Notlösung drin ...
Ja richtig, sorry mein Fehler, hatte es nur überflogen. Darauf angespielt hatte ich aber am meisten auf die Zeile:

options.inTempStorage = new byte[16*1024];
 
M

mr.freeze

Ambitioniertes Mitglied
Hallo,

ich hatte es geändert von Bitmap zu Drawable und da gibts kein
recycle().

Code:
Drawable photo = Drawable.createFromStream(is, "src name");
mit System.gc() dauert es länger bis das problem auftaucht.
ist leider noch da!
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Dann lad halt nicht des komplette Bild auf einmal mit herrunter.
//EDIT

So hatte ich das gemeint.
Code:
Url url = new URL("http://asdasdasd.de/BILD.jpg");
InputStream input = url.openStream();

DataInput.. dataI = new DataInput..(input);

FileOutputS.. out  = new openFileOutput("DEIN_CACHE_BILD.png", MODE_APPEND);

byte[] buffer = new byte[50];
int len = 0;

do{
   len = dataI.read(buffer);
   out.write(buffer);
}while(len != -1);
 
Zuletzt bearbeitet: