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。
- Android-HandlerLeak优化
- 性能优化——HandlerLeak
- @SuppressLint("HandlerLeak")应用问题
- 关于HandlerLeak的一点理解
- 源码探索系列1---Handler与HandlerLeak的那些事
- android优化---java优化
- Android优化--布局优化
- android优化
- android优化
- android优化
- android优化
- android优化
- android优化
- android优化
- Android优化
- Android优化
- android 优化
- android优化
- 2013 黄金连分数
- 关于mysql中的like语句带参数问题
- 【10-2】复杂表达式
- GridLayout网格布局
- Java后台线程
- Android-HandlerLeak优化
- SDAU课程练习2 1026
- 居中布局的几种方式
- 爬楼梯问题
- ZendFramework流程
- 有朋友要招聘,这里做个广告!
- 只读共享
- 【BZOJ2326】【HNOI2011】数学作业
- C# 服务器、客户端学习(三)