1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

BitmapFactory.decodeStream(memory leak)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von mr.freeze, 09.02.2011.

  1. mr.freeze, 09.02.2011 #1
    mr.freeze

    mr.freeze Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    1
    Registriert seit:
    02.09.2010
    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ß
     
  2. computer_freak, 09.02.2011 #2
    computer_freak

    computer_freak Gewerbliches Mitglied

    Beiträge:
    156
    Erhaltene Danke:
    7
    Registriert seit:
    14.12.2010
    Du musst einfach nur lesen was da steht, mehr können wir auch nicht.
    Wenn es nicht klappt, zieh ein englischwörterbuch zur Hilfe!
     
  3. mr.freeze, 10.02.2011 #3
    mr.freeze

    mr.freeze Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    1
    Registriert seit:
    02.09.2010
    lol

    das sagt mir, dass du das problem nicht kennst!

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

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Cached du die Bilder ?

    Oder ziehst du sie erneut vom Netz wenn du auf den List Eintrag drückst
     
  5. mr.freeze, 10.02.2011 #5
    mr.freeze

    mr.freeze Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    1
    Registriert seit:
    02.09.2010
    Ich hole sie wieder.

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

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    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
     
  7. miha, 10.02.2011 #7
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    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.
     
  8. v Ralle v, 10.02.2011 #8
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
  9. miha, 10.02.2011 #9
    miha

    miha Fortgeschrittenes Mitglied

    Beiträge:
    294
    Erhaltene Danke:
    43
    Registriert seit:
    12.01.2010
    Ä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: 10.02.2011
  10. v Ralle v, 10.02.2011 #10
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    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];
     
  11. mr.freeze, 10.02.2011 #11
    mr.freeze

    mr.freeze Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    74
    Erhaltene Danke:
    1
    Registriert seit:
    02.09.2010
    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!
     
  12. rushzero, 11.02.2011 #12
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    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: 11.02.2011

Diese Seite empfehlen