Android 如何避免Handler引起内存泄露
来源:互联网 发布:苏联东芝事件知乎 编辑:程序博客网 时间:2024/05/18 00:54
错误代码
如果在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable,
因为Runnable不是static类型,所以会有一个包含Activity实例的implicit reference --- Activity.this。
如果Activity在runnable变量run之前(10s内)被finish掉了但是Activity.this仍然存在,那么Activity的对象就不会被GC回收,从而导致memory leak。
即使使用一个静态内部类,也不能保证万事大吉。
假设在runnable执行之前,View被移除了,但是成员变量view还在继续引用它,仍然会导致memory leak。
上面的两个例子当中,导致内存泄露的两种用法分别是隐式引用(implicit reference) 和 显式引用(explicit reference)。
解决方法
解决隐式引用的方法比较简单,只要使用内部非静态类(non-static inner class)或者 top-level class(在一个独立的java文件中定义的变量)就可以将隐式变为显式,从而避免内存泄露。
如果继续使用非静态内部类,那么就要在onPause的时候手动结束那些挂起的任务(pending task)。
关于如何结束任务,Handler可百度一下,Github中某篇文章中的Canceling a pending Runnable和Canceling pending Messages。HandlerThread可自己百度了解。
解决第二个问题要用到WeakReference,WeakReference的用法可以google一下,简而言之就是:只要还有其他的stronger reference,WeakReference就可以继续引用。
这样一来问题就解决了,美中不足的是每次使用view之前都要做空指针判断。另外一个比较高效的方法就是在onResume中为runnable的view赋值,在onPause中赋值为null。
总结
在继承Handler或者HandlerThread的时候,
- 尽量定义一个static类或者top-level类。
- 如果用到了ui元素,一定要在Activity的生命周期结束之前释放掉。
参考
Asynchronous Android - Steve Liles
转载地址:http://blog.csdn.net/FeeLang/article/details/39059705
原博主个人网址(推荐):http://www.liangfeizc.com/ (很有品味的IT技术男,推荐一下。)
- Android -> 如何避免Handler引起内存泄露
- Android -> 如何避免Handler引起内存泄露
- Android -> 如何避免Handler引起内存泄露
- Android 如何避免Handler引起内存泄露
- 如何避免Handler引起内存泄露
- 如何避免Handler引起内存泄露
- Android如何避免由Context引起的内存泄露
- Android中避免Context引起内存泄露
- handler引起内存泄露
- Android中Handler可能引起内存泄露
- Android 内部Handler类引起内存泄露
- Android 中 Handler 引起的内存泄露
- Android 中 Handler 引起的内存泄露
- Android中Handler引起的内存泄露
- Android中Handler引起的内存泄露
- Android中Handler引起的内存泄露
- Android中Handler引起的内存泄露
- Android中Handler引起的内存泄露
- Android layout布局属性、标签属性总结
- 兼容性问题(下)笔记
- opengl编程-课程实验
- ios开发-storyboard所遇到的坑
- Lock与Synchronized的比较
- Android 如何避免Handler引起内存泄露
- Android中style的使用2,样式的继承(借鉴css思想)
- error while loading shared libraries libSDL-1.2.so.0
- <div+css页面布局课堂笔记>2---页面布局的盒子模型
- JAVA中Object的equals和hashCode的关联
- 计算机为什么要用补码?
- Dubbo使用demo
- 用jQuery给表格添加样式
- c++常见问题