关于Handler Leak警告的正确处理方法

       当提到Handler的时候,可能很多人都习惯这样写:

private Handler mHandler = new Handler() {
	@Override
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
	}
};

       自从ADT某个版本更新之后,如果再按照以上写法,就会提示一条警告:This Handler class should be static or leaks might occur


       百度搜索解决办法得到的答复都极为相似,大致上分为两种:


       1.给handler添加static关键字,将这个handler改为静态的。

       针对这一条,我有几点要说的:第一,通常我们使用handler都需要调用当前activity的某个非静态变量或者非静态函数,这样会导致无法直接引用;第二,即使解决了第一点的问题,如果我们在一个Fragment中定义了一个handler来处理消息,而这个Fragment是个通用模板,实际使用时会产生多个Fragment实例,这样实际只会创建一个处理消息的handler,而这样会导致的问题自然不必多说。

       2.针对集成自Handler的自定义handler,需要引用activity时采用弱引用。

       实质上跟第一种解决办法没什么区别。


       我也是意外的发现了这个问题的解决办法,请看下面的代码:

private Handler mHandler = new Handler(new Handler.Callback() {
	@Override
	public boolean handleMessage(Message msg) {
		// TODO Auto-generated method stub
		return false;
	}
}) ;

没错,就是回调接口Callback,这样做是为了防止内存泄漏,比较之前的直接复写,这样也更加规范化。

你可能感兴趣的:(Java,Android)