2017-01-19 5 views
5

Ich habe A und B Aktivitäten. Wenn ich Aktivität B aus Aktivität A starte, setze ich eine statische Bitmap-Variable auf Aktivität B. Ich zeige diese Bitmap auf dem Bildschirm an und drehe sie.Speicherverbrauch sinkt nicht auch ich recycle Bitmaps

Wenn Aktivität B beendet ist, recycle ich alle Bitmaps on onDestroy() -Methode, aber die Speicherauslastung nimmt nicht ab.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (bitmap90 != null) { 
     bitmap90.recycle(); 
     bitmap90 = null; 
    } 
    if (bitmap180 != null) { 
     bitmap180.recycle(); 
     bitmap180 = null; 

    } 
    if (bitmap270 != null) { 
     bitmap270.recycle(); 
     bitmap270 = null; 
    } 

    if (mBitmap != null) { 
     mBitmap.recycle(); 
     mBitmap = null; 
    } 

    if (((BitmapDrawable) ivOriginal.getDrawable()).getBitmap() != null) { 
     ((BitmapDrawable) ivOriginal.getDrawable()).getBitmap().recycle(); 
     ivOriginal.setImageDrawable(null); 
    } 

    if (((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap() != null) { 
     ((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap().recycle(); 
     ivOriginal90.setImageDrawable(null); 
    } 

    System.gc(); 
} 
+0

Vielleicht haben Sie woanders einen Verweis auf Ihre Bitmaps. Im Allgemeinen wird von der Verwendung statischer Eigenschaften abgeraten. Warum speichern Sie Ihre Bitmaps nicht in einer Datei und lesen sie dann in Ihrer B-Aktivität? –

Antwort

2

Von Android Developer

Gratis das native Objekt mit diesem Bitmap zugeordnet ist, und die Bezugnahme auf die Pixeldaten löschen. Dadurch werden die Pixeldaten nicht synchron freigegeben. es erlaubt einfach, Müll zu sammeln, wenn es keine anderen Referenzen gibt. Die Bitmap ist als "dead" markiert, was bedeutet, dass sie eine Ausnahme auslöst, wenn getPixels() oder setPixels() aufgerufen wird und nichts zeichnet. Dieser Vorgang kann nicht rückgängig gemacht werden. Daher sollte er nur aufgerufen werden, wenn Sie sicher sind, dass die Bitmap nicht weiter verwendet wird. Dies ist ein erweiterter Aufruf und muss normalerweise nicht aufgerufen werden, da der normale GC-Prozess diesen Speicher freigibt, wenn keine Referenzen mehr auf diese Bitmap vorhanden sind.

Recycling sorgt dafür, dass Ihre Bitmap immer dann recycelt wird, wenn GC aufgerufen wird. Dasselbe gilt für System.gc, es kann nicht sicherstellen, dass GC jetzt ausgeführt wird, es fragt nur die GC, aber GC wird nur ausgeführt, wenn das System es ausführen will.

Also einfach entspannen, wenn Sie die Bitmaps recyceln werden sie schließlich recycelt werden, geben Sie es einfach einige Zeit.