看来,当我为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(),并且只推迟了设备内存不足的点。
有什么想法吗?
答案 0 :(得分:0)
而不是使用
setImageResource (srcId);
使用
Resources r = getResources();
Bitmap b = BitmapFactory.decodeResource (r, srcId);
setImageBitmap (b);
这会绕过Resources()缓存,只需在每次需要时重新创建位图。在测试了这段代码之后,我仍然最终得到了一个内存不足的错误,但是要花费更长的时间才能实现。我将假设它是由其他东西引起的。现在,花在这个问题上的时间足够了:)