关于This Handler class should be static or leaks might occur的解决办法

今天在使用定时器的时候使用到了Handler,且使用如下
 Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                //do some code
                super.handleMessage(msg);
            }
    }

编译成功,但却提示This Handler class should be static or leaks might occur,意思就是说:Handler类必须声明为静态的,否则将会内存泄漏,接着我想当然的把handler声明为静态的,结果也是同样出现这个警告,于是上谷歌搜索了下,大致了解里面的缘由:在handler对象生成时,它将和主线程Looper对象的消息队列相关联,消息队列中的消息将会持有一个对Handler的引用,且Handler作为内部类将持有外部类的一个引用(参见java内部类的讲解,其中内部类可以访问外部类的private成员,就是因为其持有外部类的一个引用),当外部类生命周期结束时候,其上下文由于被引用而不能GC,导致资源泄漏。当声明成静态内部类时,将不会持有外部类的引用。如果要访问外部类的话可以使用弱应用。改进后的代码如下:

 static class MyHandler extends Handler{
        WeakReference<MainActivity>mActivity;
        MyHandler(MainActivity act){
            mActivity = new WeakReference<MainActivity>(act);
        }

        @Override
        public void handleMessage(Message msg) {
	    MainActivity MA = mActivity.get();
            //do some code                                                          
            super.handleMessage(msg);
        }
    }

如有错误,敬请指正,谢谢!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值