Android内存优化
来源:互联网 发布:pk10软件平刷王 编辑:程序博客网 时间:2024/06/07 06:02
觉得有用,就转一下了...
在避免内存泄露的文章中,Handler经常被提起,原因就是对象的强引用,比如一个Activity内部有一个Handler对象在运行
当我们使用上面代码创建一个Handler时,IDE就会给我提示This Handler class should be static or leaks might occur (com.example.androidtest.MainActivity.2)
告诉我们,会产生内存泄露。
当Activity关闭时,Handler不一定处理完毕,但是Handler对Activity有引用关系,导致GC无法回收Activity对象,造成内存泄露。那么Handler为什么会这样呢,那就看看它的实现吧。
在Handler对象中会隐式的引用到Activity,这就形成了强引用,也是造成内存泄露的原因。Handler是用来处理消息的,那么就要有一个对象进行消息的分发,这就是Looper
当进程启动时,ActivityThread会创建一个Looper对象,Looper对象的研究,参考老罗的文章 http://blog.csdn.net/luoshengyang/article/details/6817933
Looper中有一个MessageQueue对象,保存着消息队列
当Handler发送消息时,消息会被加入到MessageQueue中,并且Message的target对象和Handler进行了绑定,这样这个消息也就对Activity进行了引用,只要这个消息在,GC就无法回收已经关闭的Activity
handler.sendMessage发送消息最终调用下面的方法,持有了Activity
当Handler创建时,会关联到上面创建的Looper对象,这样消息机制就可以运转起来了。
知道了上面的原因,那么为了避免内存泄露,我们可以采用以下方法,具体实现网上有很多文章,这里不再罗列。
1、用static声明handler,静态类不会引用外部类
2、如果Handler中必须用到Activity,那就用WeakReference去引用
3、在Activity结束或暂停的事件中,removeMessages或者removeCallbacksAndMessages将消息队列中的消息移除(避免满足上面两条后,当Activity关闭了,但是Handler还未处理到,造成内存泄露)
源地址:http://blog.csdn.net/bdmh/article/details/49251849
1 0
- 【Android】 Android 内存优化
- android 内存优化 性能优化
- android 内存优化 性能优化 .
- Android 性能优化、内存优化
- Android 性能优化、内存优化
- Android 性能优化、内存优化
- Android-性能优化-内存优化
- Android性能优化-----内存优化
- Android-内存优化-首页内存占用优化
- android内存管理优化
- android内存优化
- android,内存优化详解
- android 内存溢出优化
- android,内存优化详解 .
- android内存泄露优化
- Android 内存优化测试
- android图片内存优化
- Android 内存优化测试
- Lambda表达式注意事项
- Tomcat 配置SSL,以及Tomcat CA证书制作和安装
- solr部署
- Unity 优化1
- 华生详解万科董事会:我为什么不支持大股东意见(上)
- Android内存优化
- 初学CentOS——shell基本命令
- 华生详解万科董事会:我为什么不支持大股东意见(中)
- webView
- WebView的用法
- 顶部导航栏目
- 横向滑动菜单
- 科学上网那点事儿
- vi使用