Handler内存泄漏原因及解决方案
一、Handler造成内存泄露的原因
在Activity内将Handler声明成非静态内部类或者匿名内部类,这样Handle默认持有外部类Activity的引用。如果Activity在销毁时,Handler还有未执行完或者正在执行的Message,而Handler又持有Activity的引用,导致GC无法回收Activity,导致内存泄漏。如以下两种情形可能导致内存泄漏
1、在Activity内将Handler声明成匿名内部类:
//匿名内部类private Handler mHandler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}};
或:
new Handler().postDelayed(new Runnable() {@Overridepublic void run() {//大量的操作,activity要销毁时还没结束}},1000);
2、在Activity内将Handler声明成非静态内部类:
//非静态内部类private class MyHandler extends Handler{@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}}private MyHandler mHandler = new MyHandler();
二、解决方案
1、静态内部类 + 弱引用
private static class MyHandler extends Handler {//弱引用,在垃圾回收时,activity可被回收private WeakReference<MainActivity> mWeakReference;public MyHandler(MainActivity activity) {this.mWeakReference = new WeakReference<>(activity);}@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}}
2、如果将Handler声明成可能导致内存泄漏的情况,在Activity销毁时,可清空Handler中未执行或正在执行的Callback以及Message:
@Overrideprotected void onDestroy() {super.onDestroy();//清空handler管道和队列mHandler.removeCallbacksAndMessages(null);}
3:非静态内部类 + 弱引用,在activity要回收时清除引用(麻烦,不推荐)
private class MyHandler extends Handler {//弱引用,在垃圾回收时,activity可被回收private WeakReference<MainActivity> mWeakReference;public MyHandler() {this.mWeakReference = new WeakReference<>(MainActivity.this);}@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}}private MyHandler mHandler = new MyHandler();@Overrideprotected void onDestroy() {super.onDestroy();//手动清除应用mHandler.mWeakReference.clear();}
Handler内存泄漏原因及解决方案相关推荐
- android handler 销毁,Android Handler内存泄漏原因及解决方案
目录: 1.须知: 主线程Looper生命周期和Activity的生命周期一致. 非静态内部类,或者匿名内部类.默认持有外部类引用. 2.原因: Handler造成内存泄露的原因.非静态内部类,或者匿 ...
- Threadlocal学习及内存泄漏原因和解决方案
因为 ThreadLocal 是基于 ThreadLocalMap 实现的,其中 ThreadLocalMap 的 Entry 继承了 WeakReference ,而 Entry 对象中的 key ...
- Handler内存泄漏问题解决方案(Android,第一行代码,This Handler class should be static or leaks might occur)
1 问题背景 博主最近在复习<第一行代码>的第10.2.2章节--在子线程中更新UI,书中给出的在UI主线程中用匿名内部类实现Handler的写法如下: private Handler h ...
- Android 系统(87)---常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...
- 常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 参考文章: (1)常见的内存泄漏原因及解决方法 (2)https://www.cnblogs.com/leeego-123/p/12187677.html 备忘一下.
- java内存泄漏怎么检测_JAVA内存泄漏原因和内存泄漏检测工具
JAVA内存泄漏原因和内存泄漏检测工具 摘要 虽然Java 虚拟机(JVM)及其垃圾收 集器(garbage collector,GC)负责管理大多数的内存任务,Java 软件程序中还是有可能出现内 ...
- android内存泄漏原因分析,Android 内存泄漏案例分析总结(Handler)
在Android开发开发中,操作不当很容易引起内存泄漏,这里主要记录下平时遇到问题,包括:静态变量(也包含集合).非静态的内部类.Handler.监听器,尤其是 Handler 在开发中要格外的注意. ...
- Handler消息机制(八):Handler内存泄漏的场景有哪些,如何避免
使用AndroidStudio检测内存泄漏: 一.内存泄漏的原因 一般内存泄漏(traditional memory leak)的原因是:由忘记释放分配的内存导致的. 逻辑内存泄漏(logical m ...
- android定时器内存泄露,Android内存泄漏分析以及解决方案
本文是看了公众号的文章,非常感谢,链接如下 概念 1.什么是内存泄漏? 一句话总结的话,那就是生命周期长的对象持有短生命周期的对象的引用导致其无法被及时释放,就会造成内存泄漏.(内存泄漏最终会导致内存 ...
最新文章
- python function函数_Python34-06-函数(function)
- python awk 读文件_测试python awk sed 读取文件指定位置时的性能
- 关于ALTERA的FPGA的弱上拉问题
- mysql索引1908
- 我对架构的理解-概念篇
- JavaScript通过style只能获取内联 状态的样式
- 简约的网络字节序处理
- Qt::FocusPolicy的使用
- docker 卸载镜像_docker删除所有容器和镜像命令
- TempData[a]多个Action方法之前共享数据
- OPERA夜审功能和参数调节
- 计算机桌面鼠标锁定了怎么办,笔记本鼠标锁住怎么办
- 共模电感 | 关键参数的计算步骤
- 计算机c盘无法扩展,win10c盘无法扩展卷怎么办
- 计算机科学与技术专业毕业答辨问题,计算机科学与技术论文答辩问题(问题及技巧介绍)...
- 程序员分七个等级,你属于哪一级?
- 拉格朗日插值、分段线性插值、三次样条插值
- 冬日舞会服务器维护中,冬日舞会
- 申请注册公司需要什么材料
- 荣耀V40最新消息 升级系统该如何更新