OutOfMemory Fehler bitte Helfen!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OutOfMemory Fehler bitte Helfen!

    Hallo [IMG:https://www.androidpit.de/img/emoticons3/smile.png]
    ich weiß dieses Problem gibts wahrscheinlich oft wenn man mit Bitmaps arbeitet und hab auch schon Lösungsanstätze gefunden doch bei mir klappt das irgendwie nicht so wie erhofft:
    erstmal zum Code
    Bitmap erzeugung:



    Java-Quellcode

    1. java class trapViews:
    2. @Override
    3. protected void onDraw(Canvas canvas) {
    4. super.onDraw(canvas);
    5. int x = 20;
    6. Random r = new Random();
    7. int i1 = r.nextInt(900 - 200) + 200;
    8. rnd = new Random();
    9. //Linke Seite
    10. System.gc();
    11. Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart);
    12. Bitmap resizedBitmap = Bitmap.createScaledBitmap(image, i1, 300, true);
    13. float left = (float) 0;
    14. float top = (float) (getHeight() - resizedBitmap.getHeight());
    15. canvas.drawBitmap(resizedBitmap, left, top, paint);
    16. //rechte Seite
    17. Bitmap images = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart1);
    18. Bitmap resizedBitmaps = Bitmap.createScaledBitmap(images, getWidth()-resizedBitmap.getWidth()-OwlHole, 300, true);
    19. float left1 = (float) (getWidth() - resizedBitmaps.getWidth());
    20. float top1 = (float) (getHeight() - resizedBitmaps.getHeight());
    21. canvas.drawBitmap(resizedBitmaps, left1, top1, paint);
    22. }
    23. }
    Alles anzeigen


    erzeugt auf der rechten sowie linken seite jeweils 1 mal das Bitmap stachelnstart^^
    dies wird jz alle 5 sec durch einen handler in meiner MainActivity aufgerufen:

    Java-Quellcode

    1. final Handler h = new Handler();
    2. Runnable r = new Runnable()
    3. {
    4. public void run()
    5. {
    6. System.gc();
    7. traps();
    8. h.postDelayed(this,5000);//Handler neustarten
    9. }
    10. };
    11. private void traps() {
    12. container = (ViewGroup) findViewById(R.id.container);
    13. trapViews tv = new trapViews(this);
    14. container.addView(tv,
    15. ViewGroup.LayoutParams.MATCH_PARENT,
    16. ViewGroup.LayoutParams.MATCH_PARENT);
    17. //tV.setImageCount(8);
    18. h.postDelayed(r,5000);
    19. }
    Alles anzeigen
    es macht das was es machen soll nämlich wird alle 5 sec rechts und links mit einer zufälligen Länge ein Bitmap produziert. Doch schon beim ersten durchlauf hängt die app kurz dann wirds produziert und das wird von mal zu mal schlimmer bis Sie abstürzt und den Fehler java.lang.OutOfMemoryError: Failed to allocate a 916812 byte allocation with 267632 free bytes and 261KB until OOM anzeigt.
    Im Code hab ich den Garbage Collecter (System.gc()) verwendet was aber genauso wenig hilft wie image.recycle();
    hat hierfür jemand eine lösung?
    übrigens developer.android.com/training…d-bitmap.html#load-bitmap hab ich mir durchgelesen und ausprobiert aber hat auch nicht so geklappt wie ich mir das vorgestellt habe ^^
    Vielen Danke schonmal im Vorraus
    Grüße Hendrix [IMG:https://www.androidpit.de/img/emoticons3/smile.png]
  • System.gc startet nicht den garbage collector. Der kann nicht manuell gestartet werden. Du sagst damit nur dem system, starte ihn schneller als per default. Das System wartet halt den günstigsten zeitpunkt ab, mit deinem aufruf erhöhst du nur die toleranz für diesen zeitpunkt. Aber aller 5 Sekunden ist nun nicht wirklich ein so kurzer zeitraum, dass das System das nicht hinbekommen sollte. Ich frage mich aber warum deine Bilder 1MB groß sind. Zumindest lässt die Fehlermeldung darauf schließen.
  • Hi Hendrix

    das Problem ist das du immer neue Bitmap erzeugst und die alten währenddessen noch vorhanden sind.
    Der recycle Aufruf eines Bitmaps markiert für den GC das, das Bitmap sozusagen tot ist. Das funktioniert aber nur wenn es keine Referenz mehr
    auf dieses Bitmap gibt.
    Ich denke einfach das du pro neue TrapView die du über dein Handler erzeugst und zu deinem View Container immer neu hinzufügst, das auch jedes mal zwei
    Bitmaps erzeugt werden. Wenn es sich bei deinem Container um eine ScrollView handelt, existieren deine erzeugten Bitmaps im Speicher noch, selbst wenn sie auf dem Display
    grade nicht sichtbar sind.

    Du solltest dir mal die RecyclerView & StaggeredGridLayoutManager von Google anschauen.

    developer.android.com/referenc…/widget/RecyclerView.html

    developer.android.com/referenc…redGridLayoutManager.html

    Dahinter verbirgt sich das Konzept erzeugte Views innerhalb eines scrollbaren Bereichs wieder zuverwenden, wenn sie aus dem sichtbaren Bereich verschwinden.
    Dies sorgt auch dafür das dein Content flüssiger scrollt.

    Ich hoffe das hilft dir etwas weiter