对于下面的代码
我们在销毁是调用deinit()释放mBitmap的内存,看似一切都正常,但当实际运行时会发现每创建销毁一次MyView 就会带来一次内存泄露,即mBitmap.recycle();语句并没有成功释放mBitmap的内存。
分析发现是由于mCanvas中有mBitmap的引用,导致后者引用计数无法为0,所以不能释放内存,解决方法:
public class MyView {
private Canvas mCanvas;
private Bitmap mBitmap;
public MyView(){
...
mBitmap = Bitmap.createBitmap(...);
mCanvas = new Canvas(mBitmap);
...
}
public void deinit(){
// 销毁时调用
if(mBitmap != null && !mBitmap.isRecycled()){
mBitmap.recycle();
mBitmap = null;
}
}
}
我们在销毁是调用deinit()释放mBitmap的内存,看似一切都正常,但当实际运行时会发现每创建销毁一次MyView 就会带来一次内存泄露,即mBitmap.recycle();语句并没有成功释放mBitmap的内存。
分析发现是由于mCanvas中有mBitmap的引用,导致后者引用计数无法为0,所以不能释放内存,解决方法:
要将mCanvas 置为NULL。