2017-01-19 108 views
5

我有A和B的活動。當我從活動A開始活動B時,我在活動B上設置了靜態位圖變量。我在屏幕上顯示該位圖並旋轉它。內存使用率不降低甚至我回收位圖

當活動B完成,我回收上的onDestroy()方法,但內存使用量沒有減少所有位圖。

@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

也許你在其他地方持有對你的位圖的引用。通常不鼓勵使用靜態屬性。你爲什麼不把你的位圖保存在一個文件中,然後在你的B活動中讀取它? –

回答

2

Android Developer

免與該位圖相關聯的原生對象,並清除參考像素數據。 這不會同步釋放像素數據;它只是允許它被垃圾收集,如果沒有其他的參考文獻。位圖被標記爲「死」的,這意味着它會拋出一個異常的getPixels()或的setPixels()被調用,並且將繪製什麼。這個操作不能顛倒過來,所以只有在你確定沒有進一步的位圖使用時才應該調用它。這是一種先進的呼叫,並且通常不需要叫,因爲正常的GC進程將釋放該內存的時候有這個位圖不再引用。

回收只是確保您的位圖將被回收,每當GC被調用。 也是一樣的System.gc,它不能確保GC運行,現在,它只是要求GC​​運行,但是當系統需要的它運行GC纔會運行。

所以只是放鬆,如果你正在回收,他們將得到回收的位圖最終只是給它一些時間。