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

今天写代码时候,留意了一下使用Handler的时候爆出的黄色警告,很多人使用Handler都是直接采用如下方式:

<span style="font-size:12px;">private Handler mHandler = new Handler() {

        public void handleMessage(android.os.Message msg) {
           
        };
    };</span>

这样使用Handler的时候,就会出现标题里面的报警信息。

后来在网上找了一个解决办法,如下:

具体如何解决,在国外有人提出,如下:

Issue: Ensures that Handler classes do not hold on to a reference to an outer class

In Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class.

大体翻译如下:

Handler 类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那 么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

static class MyHandler extends Handler {  
                WeakReference<PopupActivity> mActivity;  // 该处的PopupActivity为当前Handler的所在类
     
                MyHandler(PopupActivity activity) {  
                        mActivity = new WeakReference<PopupActivity>(activity);  
                }  
     
                @Override  
                public void handleMessage(Message msg) {  
                        PopupActivity theActivity = mActivity.get();  
                        switch (msg.what) {  
                        case 0:  
                                theActivity.popPlay.setChecked(true);  
                                break;  
                        }  
                }  
        }  
     
        MyHandler ttsHandler = new MyHandler(this);  
        private Cursor mCursor;  
     
        private void test() {  
                ttsHandler.sendEmptyMessage(0);  
        }  

WeakReference则类似于可有可无的东西。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,说白了就是一个没那么strong要求垃圾回收器将一个对象保留在内存中。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

关于直接采用匿名内部类使用Handler造成的内存泄露问题可以参考另一篇文章:http://blog.youkuaiyun.com/victor_fang/article/details/51514397

参考文章:http://www.cnblogs.com/jevan/p/3168828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值