2013-09-27 29 views
0

我的活動有一個ImageView,佔用大約一半的肖像畫面和少一點的景觀。我使用inSampleSize加載位圖以節省內存,但我沒有做任何明確清理內存的操作。我以前瘋狂回收我的Bitmaps之前薑餅,但我已經更加放鬆,因爲位圖數據顯然被轉移到Dalvik虛擬機。沒有任何清理代碼,事情在正常使用情況下工作,但我注意到,如果我多次旋轉此活動,內存不足。因此,我添加了薑餅之前看到的那種積極的內存清理代碼,它不再崩潰。不過,我想知道這是否過分。是否所有這些代碼都等同於在OnDestroy中將我的Bitmap和ImageView設置爲null,或者是追蹤底層Bitamp對象並回收它們仍然有效且必要的額外工作?這裏是我的代碼,修好了我OOME崩潰:仍然必須回收Android 4+中的位圖嗎?

Bitmap thumbnail; 
@InjectView(R.id.thumbnail) ImageView image; 

@Override 
protected void onDestroy() { 
    cleanupImageMemory(); 
    super.onDestroy(); 
} 

private void cleanupImageMemory() { 
    if (thumbnail != null) { 
     thumbnail.recycle(); 
     thumbnail = null; 
    } 
    if (image != null) { 
     Drawable d = image.getDrawable(); 
     if (d != null && d instanceof BitmapDrawable) { 
      BitmapDrawable db = (BitmapDrawable) d; 
      if (db.getBitmap() != null) { 
       db.getBitmap().recycle(); 
      } 
     } 
     d = null; 
     image = null; 
    } 
    System.gc(); 
} 
+0

當你發現你得到「內存不足」時,屏幕方向是改變了這麼多次,對不對?但是當方向發生變化時,活動被重新創建,因此主動清理內存,通過在AndroidManifest.xml中將屬性「android:configchanges」設置爲活動來停止活動的重新創建。 –

+0

位圖有多大?它是沒有意義的,如果它是一個小的,它會導致OOM。 –

回答