自定义View时, 使用Canvas、Bitmap时易犯的内存泄露问题

对于下面的代码

  1. 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。




你可能感兴趣的:(Android)