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

来源:互联网 发布:保安巡更软件 编辑:程序博客网 时间:2024/06/11 11:32
今天在使用定时器的时候使用到了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);        }    }

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



0 0
原创粉丝点击