android handler 销毁,Android Handler内存泄漏原因及解决方案
目录:
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内存泄漏原因及解决方案相关推荐
- Threadlocal学习及内存泄漏原因和解决方案
因为 ThreadLocal 是基于 ThreadLocalMap 实现的,其中 ThreadLocalMap 的 Entry 继承了 WeakReference ,而 Entry 对象中的 key ...
- Handler内存泄漏原因及解决方案
一.Handler造成内存泄露的原因 在Activity内将Handler声明成非静态内部类或者匿名内部类,这样Handle默认持有外部类Activity的引用.如果Activity在销毁时,Hand ...
- Android 系统(87)---常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...
- android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary
2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...
- Handler为什么可能会造成内存泄漏以及可用的四种解决方法
在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue. 根据官网的描述 There are t ...
- 一次性讲清楚 Handler 可能导致的内存泄漏和解决办法 | 开发者说·DTalk
本文原作者: 小虾米君,原文发布于: TechMerger 本文重制和补充了多个示意图和章节,期望能为您一次性讲清楚 Handler 可能导致的内存泄漏和解决办法! Handler 使用不当? 为什么 ...
- Android应用程序崩溃:影响、原因和解决方案
Android应用程序崩溃:影响.原因和解决方案 您是否曾经为诊断和修复移动应用程序崩溃而苦恼?这可能是一个非常耗时且令人沮丧的问题. 而且,开发人员交付人们喜爱的稳定可靠的移动应用程序的压力从未如此 ...
- 常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 参考文章: (1)常见的内存泄漏原因及解决方法 (2)https://www.cnblogs.com/leeego-123/p/12187677.html 备忘一下.
- java内存泄漏怎么检测_JAVA内存泄漏原因和内存泄漏检测工具
JAVA内存泄漏原因和内存泄漏检测工具 摘要 虽然Java 虚拟机(JVM)及其垃圾收 集器(garbage collector,GC)负责管理大多数的内存任务,Java 软件程序中还是有可能出现内 ...
最新文章
- 解惑图数据库!你知道什么是图数据库吗?
- 华为南太无线解决方案部梁旭阳_华为无线充电新专利:激光无线充电,替代传统半接触式...
- 前端学习(594):network面板
- fastJson null字符串转空 null数字转0
- seafile私有网盘搭建
- 《DeepXDE:a deep learning library for solving differential equations》梳理
- laravel后台可修改配置自动加载
- 在无锡调试的工作,到了泰安出错了
- [Gamma阶段]第四次Scrum Meeting
- 我的世界jAVA如何变创造_我的世界怎么把石头变成空气
- dategurd oracle_Oracle Data Guard
- 比数据可视化更高级的大屏可视化
- 数值计算——线性最小二乘问题
- 手把手教你搭建Nightingale夜莺监控系统
- git pull 拉取代码的时候报错 Pulling is not possible because you have unmerged files.
- 关于单向TSP旅行商问题/修路问题/最小生成树问题的求解讨论
- ios客户端跟h5页面桥接
- 【Error】解决:Not creating XLA devices, tf_xla_enable_xla_devices not set
- mysqldumpnbsp;参数说明
- 【tio-websocket】3、tio-websocket-server实现任何地方都能对用户发送消息