通常写法
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
发现代码黄色块,警告:Issue id: HandlerLeak,通过对handler添加
@SuppressLint("HandlerLeak")
不推荐,这只是躲避了编辑器的检查,没有达到效果。
另外一种无警告写法:
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d(TAG,"msg2:"+msg.what);
return true;
}
})
会发现我这里返回true(当前处理,不需要消息下传),默认是false(当前消息需要下传处理)
验证上面的return false和true影响
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d(TAG,"msg2:"+msg.what);
return true;
}
})
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(TAG,"msg1:"+msg.what);
}
};
调用:
handler.sendEmptyMessage(1);
打印发现:只打印了msg2信息
把return改为 false。打印发现:msg2先打印后打印msg1
总结:使用Handler.Callback作为回调,返回写成true(如果不需要下传信息)是推荐写法。
handler释放
知道message的arg或者runable则可以直接释放
mHandler.removeMessages(0->n);
mHandler.removeCallbacks(r);
对于不知道活着模糊的则使用如下方法,移除所有和这个handler有关的callbacks和message
mHandler.removeCallbacksAndMessages(null);
网友评论