2015-03-08 253 views
0

看來,當我打電話setImageDrawable(空)爲ImageView的,位圖沒有被釋放。我能做些什麼來強制它釋放位圖內存?ImageView.setImageDrawable(NULL)不釋放內存

我有一個需要顯示大量可繪製的,但不是在同一時間的活動。我已經擴展了ImageView,如下所示。 XML佈局文件聲明瞭這個實例,「src」屬性設置爲「@null」。作爲替代,我有一個自定義屬性來保存可繪製資源ID。

public class ImageViewHolder extends ImageView 
{ 
    int srcId = 0; 

    //----------------------------------------------------------------------------- 
    public ImageViewHolder (Context context, AttributeSet attrs) 
    { 
    super (context, attrs); 

    TypedArray a = context.obtainStyledAttributes (attrs, R.styleable.ImageViewHolder, 0, 0); 
    srcId = a.getResourceId (R.styleable.ImageViewHolder_src, 0); 
    a.recycle(); 
    } 

    //----------------------------------------------------------------------------- 
    public void showDrawable (boolean makeVisible) 
    { 
    if (makeVisible) 
    { 
//  Drawable d = getResources().getDrawable (srcId); 
//  setImageDrawable (d); 
     setImageResource (srcId); 
    } 
    else // hide & free memory 
    { 
     Bitmap bitmap = ((BitmapDrawable)getDrawable()).getBitmap(); 
     setImageResource(0); 
     bitmap.recycle(); 
//  setImageDrawable (null); 
    } 
    } 

} 

我試過使用SetImagerResource()來代替,但得到相同的結果。在清除drawable之後,我也嘗試調用System.gc(),並且只推遲了設備內存不足的地方。

任何想法?

+0

你可以仔細嘗試足夠的時間[Bitmap.recycle()](http://developer.android.com/reference/android/graphics/Bitmap.html#recycle() ) – Blackbelt 2015-03-08 20:52:21

+0

好主意。沒有工作 - 仍然出現內存不足的錯誤。 – 2015-03-08 21:28:56

+0

位圖有多大?你有多少記憶?你使用運行時緩存嗎? – Blackbelt 2015-03-08 21:29:40

回答

0

而不是使用

setImageResource (srcId); 

使用

Resources r = getResources(); 
Bitmap b = BitmapFactory.decodeResource (r, srcId); 
setImageBitmap (b); 

這繞過資源()緩存和重新創建只是每次你需要它的時候的位圖。在測試了這段代碼之後,我仍然最終發現內存不足的錯誤,但是到達那裏需要更長的時間。我會假設它是由其他東西引起的。現在,這是花在這個問題:)