ImageView.setImageDrawable(null)不释放内存

时间:2015-03-08 20:46:07

标签: android memory-leaks imageview

看来,当我为ImageView调用setImageDrawable(null)时,位图没有被释放。我该怎么做才能强制它释放位图内存?

我的活动需要显示大量的drawable,但不能同时显示。我已经扩展了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(),并且只推迟了设备内存不足的点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

而不是使用

setImageResource (srcId);

使用

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

这会绕过Resources()缓存,只需在每次需要时重新创建位图。在测试了这段代码之后,我仍然最终得到了一个内存不足的错误,但是要花费更长的时间才能实现。我将假设它是由其他东西引起的。现在,花在这个问题上的时间足够了:)