美文网首页
Handler中@SuppressLint黄色警告的原因以及解决

Handler中@SuppressLint黄色警告的原因以及解决

作者: 云烟渐成雨 | 来源:发表于2019-08-04 00:06 被阅读0次

    @SuppressLint("HandlerLeak")

    第一种原因引起

    原因:Handler在Android中用于消息的发送与异步处理,常常在Activity中作为一个匿名内部类来定义,此时Handler会隐式地持有一个外部类对象(通常是一个Activity)的引用。当Activity已经被用户关闭时,由于Handler持有Activity的引用造成Activity无法被GC回收,这样容易造成内存泄露。

    解决办法:将其定义成一个静态内部类(此时不会持有外部类对象的引用),在构造方法中传入Activity并对Activity对象增加一个弱引用,这样Activity被用户关闭之后,即便异步消息还未处理完毕,Activity也能够被GC回收,从而避免了内存泄露。

    public static class MyHandler extends Handler {
            private WeakReference<Activity> reference
            public MyHandler(Activity activity) {
                reference = new WeakReference<Activity>(activity);
            }
            @Override
            public void handleMessage(Message msg) {
                if (reference.get() != null) {
                    switch (msg.what) {
                    case 0:
                        // do something...
                        break;
                    default:
                        // do something...
                        break;
                    }
                }
            }
    }
    

    第二种原因引起

    不规范的写法:
     private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
    
            };
        };
    正确的写法:
     private Handler mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                return false;
            }
        });
    

    原文链接:https://blog.csdn.net/qq_34706837/article/details/54964306

    相关文章

      网友评论

          本文标题:Handler中@SuppressLint黄色警告的原因以及解决

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