美文网首页
Handler内存泄漏

Handler内存泄漏

作者: 主音King | 来源:发表于2018-12-17 13:54 被阅读9次

    通常写法

    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);
    

    相关文章

      网友评论

          本文标题:Handler内存泄漏

          本文链接:https://www.haomeiwen.com/subject/twgqkqtx.html