Andro 4000 id内存泄漏(Handler造成的内存泄漏(一))
2016-06-16 20:28
302 查看
Handler造成的内存泄漏(一)
平时在处理网络任务或者封装一些请求回调等api都应该会借助Handler来处理。
Handler如此常用,一个不小心,比较容易造成我们app的内存泄漏。
注意:我是用LeakCanary来检测内存是否泄漏,这个工具很多大型的公司都在用,比如酷狗,腾讯等等。
下载地址:https://github.com/square/leakcanary
①例子如图:(这是很多人平时经常的写的代码。)
分析: 在项目开发中,我们经常会写上面这样的代码吧? 在一个界面中加载数据loadData,加载数据完成后,发送Message,然后在在Handler的handlerMessage()中去处理我们的消息。
运行代码,我们做如下操作:
1. 点击按钮,在15秒内点击手机返回键,关闭MainActivity
2. 等待10秒左右
将会发现,LeakCanary提示内存泄漏:
分析泄漏的原因:
由于mhandler是Handler的匿名内部类的实例,所以它持有外部类Activity的引用,我们知道消息队列是在一个Looper线程中不断轮询处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,那么当这个Activity退出时,消息队列中还有未处理的消息或者正在处理消息,将导致该Activity的内存资源无法及时回收,引发内存泄漏。
处理办法一: 使用静态内部类,将上面的代码改一下:
修改代码后运行,重复上面相同的操作,LeakCanary没有报出内存泄漏。
还有一个问题,大家注意了,在我们平时使用handlerMessage处理消息时,很多时候需要去使用外部类MainActivity的函数,比如我们需要更新MainActivity的UI 。
但是现在我们的问题时,我们静态内部类没有MainActivity的引用,没办法直接去访问MainActivity的属性和函数啊,怎么办呢 ?
Handler使用方式升级版: 使用弱引用 -解决静态内部类访问外部类
在第二篇Handler造成的内存泄漏(二)会详细说到。
平时在处理网络任务或者封装一些请求回调等api都应该会借助Handler来处理。
Handler如此常用,一个不小心,比较容易造成我们app的内存泄漏。
注意:我是用LeakCanary来检测内存是否泄漏,这个工具很多大型的公司都在用,比如酷狗,腾讯等等。
下载地址:https://github.com/square/leakcanary
①例子如图:(这是很多人平时经常的写的代码。)
分析: 在项目开发中,我们经常会写上面这样的代码吧? 在一个界面中加载数据loadData,加载数据完成后,发送Message,然后在在Handler的handlerMessage()中去处理我们的消息。
运行代码,我们做如下操作:
1. 点击按钮,在15秒内点击手机返回键,关闭MainActivity
2. 等待10秒左右
将会发现,LeakCanary提示内存泄漏:
分析泄漏的原因:
由于mhandler是Handler的匿名内部类的实例,所以它持有外部类Activity的引用,我们知道消息队列是在一个Looper线程中不断轮询处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,那么当这个Activity退出时,消息队列中还有未处理的消息或者正在处理消息,将导致该Activity的内存资源无法及时回收,引发内存泄漏。
处理办法一: 使用静态内部类,将上面的代码改一下:
修改代码后运行,重复上面相同的操作,LeakCanary没有报出内存泄漏。
还有一个问题,大家注意了,在我们平时使用handlerMessage处理消息时,很多时候需要去使用外部类MainActivity的函数,比如我们需要更新MainActivity的UI 。
但是现在我们的问题时,我们静态内部类没有MainActivity的引用,没办法直接去访问MainActivity的属性和函数啊,怎么办呢 ?
Handler使用方式升级版: 使用弱引用 -解决静态内部类访问外部类
在第二篇Handler造成的内存泄漏(二)会详细说到。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories