Android-HandlerLeak优化

来源:互联网 发布:淘客微博推广软件 编辑:程序博客网 时间:2024/06/10 22:40


       刚开始用AndroidStudio,只是听说它的功能强大,然而并没有真的体会到。

       后来实习的时候,听导师介绍它有一个非常实用的功能,就是“Inspect Code",它可以帮助我们检测当前代码中存在不良代码以及可能出现的bug,并提示我们修改和优化的方法。

具体方法是,在需要检测的页面,右键点击再点击Analyze,选择“Inspect Code"。

       如图:

       


      然后,我们就得到了如下的优化建议啦:

      

     

     

     这么多需要修改的地方,好好改吧,基本改完,代码会比之前好一些。

     然后,这里想说的是AndroidStudio经常提示我们的一个代码风险:HandlerLeak

     一开始使用Handler的时候,都是如下的写法:

     

2.Handler handler = new Handler() {  3.    public void handleMessage(Message msg) {  4.        switch (msg.what) {  5.        case MSG:  6.            break; 7.        default:  8.            break;  9.        }   10.    };  }; 
 

    这时候AndroidStudio就要提示我们啦,这样会造成内存泄露,然后还在代码页里把它标成黄色的,强迫症的人表示,真的忍不了啊。

    优化的方法如下:

   

1.static class MyHandler extends Handler {  2.        // WeakReference to the outer class's instance.  3.        private WeakReference<Outer> mOuter;  4.        public MyHandler(Outer outer) {  5.            mOuter = newWeakReference<Outer>(outer);  6.        }  7.        @Override  8.        public void handleMessage(Message msg) {  9.            Outer outer = mOuter.get();  10.            if(outer != null) {  11.               //操作  12.            }  13.        }  14.    }  

     经过这样的修改,我们的handler导致的内存泄露的风险解除啦,但是,我们还需要知道原理吧,于是我开始疯狂查资料啦。

     为什么Handler如一开始代码示例的使用会造成内存泄露呢?

     在应用程序线程的MessageQueue中排队的Message对象还保留他们的目标Handler。如果Handler是一个内部类,它的外部类将被保留。当某个Activity要被销毁,但是它的内部类Handler还保留着,导致了外部类Activity也无法销毁,于是,内存泄露产生了。为了避免泄漏外部类,声明一个Handler子类为静态内部类,其内部持有一个对外部类对象的WeakReference。


      

0 0