记关于处理Handler内存泄漏犯的一个错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/One_Month/article/details/88709633

说到内存泄漏,可能首先就想到创建非静态Handler内部类,导致Handler持有外部Activity引用

class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
		}
}

网上有很多说处理方法有两种
1.使用静态内部类,也就是

static class MyHandler extends Handler{
}

2.使用弱引用,不让他持有activity的强引用,让Activity能够被及时回收

static class MyHandler extends Handler{
		private WeakReference<NoLeakActivity> mActivity;

        public NoLeakHandler(NoLeakActivity activity){
            mActivity = new WeakReference<>(activity);
        }
}

!!!注意,第二种使用弱引用在这里并不是解决泄漏方式,他就算写了弱引用持有,内部类本身默认还是会持有外部类的强引用,而且静态内部类已经解决了内部类持有外部类引用问题。

弱引用在这里的意义
1.能够在handler处理过程中避免activity早已销毁的情况,可以判断activity是否为空,决定是否继续执行原任务

static class MyHandler extends Handler{
		private WeakReference<NoLeakActivity> mActivity;

        public NoLeakHandler(NoLeakActivity activity){
            mActivity = new WeakReference<>(activity);
        }
        
		@Override
		public void handleMessage(Message msg) {
		//Activity已销毁,取消任务
			if(mActivity == null) {
				return;
			}
		}
}

2.由于我们使用的是静态内部类Handler,无法访问外部非静态属性和方法,获取到Activity引用,这样就可以调用了,同时避免持有强引用导致无法及时回收。

之前被一些博客误导了,结果被人问起,尴尬了,还是没有深入思考惹的祸。

猜你喜欢

转载自blog.csdn.net/One_Month/article/details/88709633