目录:

1.须知:

主线程Looper生命周期和Activity的生命周期一致。

非静态内部类,或者匿名内部类。默认持有外部类引用。

2.原因:

Handler造成内存泄露的原因。非静态内部类,或者匿名内部类。使得Handler默认持有外部类的引用。在Activity销毁时,由于Handler可能有未执行完/正在执行的Message。导致Handler持有Activity的引用。进而导致GC无法回收Activity。

3.可能造成内存泄漏

匿名内部类:

//匿名内部类

Handler handler=new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

}

};

非静态内部类:

//非静态内部类

protected class AppHandler extends Handler {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

// TODO: 2019/4/30

}

}

}

4.解决方法:

Activity销毁时,清空Handler中,未执行或正在执行的Callback以及Message。

// 清空消息队列,移除对外部类的引用

@Override

protected void onDestroy() {

super.onDestroy();

mHandler.removeCallbacksAndMessages(null);

}

//Handler源码中removeCallbacksAndMessages()注释含义

/**

* Remove any pending posts of callbacks and sent messages whose

* obj is token. If token is null,

* all callbacks and messages will be removed.

*/

public final void removeCallbacksAndMessages(Object token) {

mQueue.removeCallbacksAndMessages(this, token);

}

静态内部类+弱引用

private static class AppHandler extends Handler {

//弱引用,在垃圾回收时,被回收

WeakReference activity;

AppHandler(Activity activity){

this.activity=new WeakReference(activity);

}

public void handleMessage(Message message){

switch (message.what){

//todo

}

}

}

5. 其他:

即使内存泄漏了。待handler中的消息处理完。下次GC时即可回收本次未回收的内存。

以上就是Android Handler内存泄漏原因及解决方案的详细内容,更多关于Android Handler内存泄漏的资料请关注脚本之家其它相关文章!

android handler 销毁,Android Handler内存泄漏原因及解决方案相关推荐

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

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

  2. Handler内存泄漏原因及解决方案

    一.Handler造成内存泄露的原因 在Activity内将Handler声明成非静态内部类或者匿名内部类,这样Handle默认持有外部类Activity的引用.如果Activity在销毁时,Hand ...

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

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

  4. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  5. Handler为什么可能会造成内存泄漏以及可用的四种解决方法

    在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue. 根据官网的描述 There are t ...

  6. 一次性讲清楚 Handler 可能导致的内存泄漏和解决办法 | 开发者说·DTalk

    本文原作者: 小虾米君,原文发布于: TechMerger 本文重制和补充了多个示意图和章节,期望能为您一次性讲清楚 Handler 可能导致的内存泄漏和解决办法! Handler 使用不当? 为什么 ...

  7. Android应用程序崩溃:影响、原因和解决方案

    Android应用程序崩溃:影响.原因和解决方案 您是否曾经为诊断和修复移动应用程序崩溃而苦恼?这可能是一个非常耗时且令人沮丧的问题. 而且,开发人员交付人们喜爱的稳定可靠的移动应用程序的压力从未如此 ...

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

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

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

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

最新文章

  1. 解惑图数据库!你知道什么是图数据库吗?
  2. 华为南太无线解决方案部梁旭阳_华为无线充电新专利:激光无线充电,替代传统半接触式...
  3. 前端学习(594):network面板
  4. fastJson null字符串转空 null数字转0
  5. seafile私有网盘搭建
  6. 《DeepXDE:a deep learning library for solving differential equations》梳理
  7. laravel后台可修改配置自动加载
  8. 在无锡调试的工作,到了泰安出错了
  9. [Gamma阶段]第四次Scrum Meeting
  10. 我的世界jAVA如何变创造_我的世界怎么把石头变成空气
  11. dategurd oracle_Oracle Data Guard
  12. 比数据可视化更高级的大屏可视化
  13. 数值计算——线性最小二乘问题
  14. 手把手教你搭建Nightingale夜莺监控系统
  15. git pull 拉取代码的时候报错 Pulling is not possible because you have unmerged files.
  16. 关于单向TSP旅行商问题/修路问题/最小生成树问题的求解讨论
  17. ios客户端跟h5页面桥接
  18. 【Error】解决:Not creating XLA devices, tf_xla_enable_xla_devices not set
  19. mysqldumpnbsp;参数说明
  20. 【tio-websocket】3、tio-websocket-server实现任何地方都能对用户发送消息

热门文章

  1. 对于operation操作的理解
  2. 只需你十分钟却可以让你和你的父母都至少多活十年
  3. java object转对象,object如何强转为对象
  4. 最容易理解的 js事件冒泡原理
  5. 2021年安全员-C证模拟试题及安全员-C证实操考试视频
  6. Ⅱ 设计供应链网络 Chapter 4. 分销网络设计及其在全渠道零售中的应用
  7. 博客摘录「 均线多头排列选股公式,选出均线多头刚起步的标的」2023年5月18日
  8. Ubuntu20.04 sudo免密码
  9. Qt中QMessageBox的用法---看这一篇就够了
  10. 手机镜头参数--手机摄影训练营第五期---S05-20170605