一、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内存泄漏原因及解决方案相关推荐

  1. android handler 销毁,Android Handler内存泄漏原因及解决方案

    目录: 1.须知: 主线程Looper生命周期和Activity的生命周期一致. 非静态内部类,或者匿名内部类.默认持有外部类引用. 2.原因: Handler造成内存泄露的原因.非静态内部类,或者匿 ...

  2. Threadlocal学习及内存泄漏原因和解决方案

    因为 ThreadLocal 是基于 ThreadLocalMap 实现的,其中 ThreadLocalMap 的 Entry 继承了 WeakReference ,而 Entry 对象中的 key ...

  3. Handler内存泄漏问题解决方案(Android,第一行代码,This Handler class should be static or leaks might occur)

    1 问题背景 博主最近在复习<第一行代码>的第10.2.2章节--在子线程中更新UI,书中给出的在UI主线程中用匿名内部类实现Handler的写法如下: private Handler h ...

  4. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  5. 常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 参考文章: (1)常见的内存泄漏原因及解决方法 (2)https://www.cnblogs.com/leeego-123/p/12187677.html 备忘一下.

  6. java内存泄漏怎么检测_JAVA内存泄漏原因和内存泄漏检测工具

    JAVA内存泄漏原因和内存泄漏检测工具 摘要 虽然Java 虚拟机(JVM)及其垃圾收 集器(garbage collector,GC)负责管理大多数的内存任务,Java 软件程序中还是有可能出现内 ...

  7. android内存泄漏原因分析,Android 内存泄漏案例分析总结(Handler)

    在Android开发开发中,操作不当很容易引起内存泄漏,这里主要记录下平时遇到问题,包括:静态变量(也包含集合).非静态的内部类.Handler.监听器,尤其是 Handler 在开发中要格外的注意. ...

  8. Handler消息机制(八):Handler内存泄漏的场景有哪些,如何避免

    使用AndroidStudio检测内存泄漏: 一.内存泄漏的原因 一般内存泄漏(traditional memory leak)的原因是:由忘记释放分配的内存导致的. 逻辑内存泄漏(logical m ...

  9. android定时器内存泄露,Android内存泄漏分析以及解决方案

    本文是看了公众号的文章,非常感谢,链接如下 概念 1.什么是内存泄漏? 一句话总结的话,那就是生命周期长的对象持有短生命周期的对象的引用导致其无法被及时释放,就会造成内存泄漏.(内存泄漏最终会导致内存 ...

最新文章

  1. python function函数_Python34-06-函数(function)
  2. python awk 读文件_测试python awk sed 读取文件指定位置时的性能
  3. 关于ALTERA的FPGA的弱上拉问题
  4. mysql索引1908
  5. 我对架构的理解-概念篇
  6. JavaScript通过style只能获取内联 状态的样式
  7. 简约的网络字节序处理
  8. Qt::FocusPolicy的使用
  9. docker 卸载镜像_docker删除所有容器和镜像命令
  10. TempData[a]多个Action方法之前共享数据
  11. OPERA夜审功能和参数调节
  12. 计算机桌面鼠标锁定了怎么办,笔记本鼠标锁住怎么办
  13. 共模电感 | 关键参数的计算步骤
  14. 计算机c盘无法扩展,win10c盘无法扩展卷怎么办
  15. 计算机科学与技术专业毕业答辨问题,计算机科学与技术论文答辩问题(问题及技巧介绍)...
  16. 程序员分七个等级,你属于哪一级?
  17. 拉格朗日插值、分段线性插值、三次样条插值
  18. 冬日舞会服务器维护中,冬日舞会
  19. 申请注册公司需要什么材料
  20. 荣耀V40最新消息 升级系统该如何更新

热门文章

  1. 简易的验证码自动识别脚本
  2. LeetCode 每日一题 2021-6-15 (山峰数组的封顶索引)
  3. PaddleOCR文字识别使用教程(训练自己的数据集)(一)
  4. Android5.0及以上实现隐藏标题栏及全屏
  5. 知乎代运营经验:知乎问答怎么运营,怎么增粉?
  6. 关于产品的一些思考——淘友天下之脉脉
  7. Let's Encrypt证书生成,certbot-auto 生成ssl通用证书 配置https 自动续期
  8. c语言取字符数组最后几位
  9. Java后端最佳的学习路线
  10. 2023全国职业院校技能大赛赛项规程-G2073-网络系统管理竞赛