Handler内存泄漏及其解决方案

Frida动态Hook实战:逆向美团外卖mtgsig3.0签名算法 在移动应用安全与数据爬取领域,API签名是保障请求合法性与数据完整性的核心机制。其原理是通过特定算法,将请求参数、时间戳等动态要素加密生成唯一字符串,服务器端通过验签防止数据篡改与伪造。这项技术的核心价值在于,它构建了客户端与服务器之间的可信通道,是移动端数据交互安全的基础。在自动化测试、安全审计、市场数据分析等应用场景中,理解并能够获取或绕过签名验证是关键前提。本文聚焦于美团外卖App的核心签名参数mtgsig3.0,针对其复杂的算法逻辑,提供了一套基于Frida的动态Hook解决方案。通过Hook技术, 阅读详情

几个概念

Java垃圾回收机制(GC)

Java使用自动垃圾回收机制,回收的条件就是对象是否被引用。也就是说如果对象处于不可到达状态就会被回收掉。

Java四种引用

这里写图片描述

Activity回收

Activity被销毁的时候在onDestory()方法中,系统销毁了这个Activity的实例在内存中占据的空间。在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。

Handler内存泄漏的原因?

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        //修改Activity的UI
        mImageView.setImageBitmap(mBitmap);
    }
};
  1. 当使用内部类(包括匿名类)来创建Handler的时候,因为通过Handler来操作Activity中的View,所以Handler对象会隐式地持有一个外部类对象(通常是一个Activity)的引用。
  2. Handler通常会伴随着一个耗时的后台线程(从网络下载图片),这个后台线程在任务执行完毕之后(图片下载完毕),通过消息机制通知Handler,然后Handler把图片更新到界面。
  3. 如果用户在网络请求过程中关闭了Activity,正常情况下,Activity不再被使用,在onDestory()方法中执行GC检查时就应该被回收掉。但由于这时线程尚未执行完,而该线程持有Handler的引用(不然它怎么发消息给Handler?),这个Handler又持有Activity的引用,就导致该Activity无法被回收,造成内存泄漏,直到网络请求结束(图片下载完毕)。
  4. 如果你执行了Handler的postDelayed()方法,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue中,那么在你设定的delay到达之前,会有一条MessageQueue -> Message -> Handler -> Activity的链,导致你的Activity被持有引用而无法被回收。
  5. 同一个Acticity反复进行几次便会程序占用内存超过系统限制,FC。

解决方案

逻辑控制

  1. 在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。
  2. 如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。

Handler声明为静态类

静态类不持有外部类的对象,所以你的Activity可以随意被回收,所以不会导致外部类实例出现内存泄露。

static class MyHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        //修改Activity的UI
        mImageView.setImageBitmap(mBitmap);
    }
}

但是,Handler一旦无法持有外部类的对象,就无法修改Activity的View,那么使用Handler就没有意义了。 
为了解决这个问题,我们可以在Handler中增加一个对Activity的弱引用(WeakReference):

static class MyHandler extends Handler {
    WeakReference<Activity > mActivityReference;

    MyHandler(Activity activity) {
        mActivityReference= new WeakReference<Activity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        final Activity activity = mActivityReference.get();
        if (activity != null) {
            mImageView.setImageBitmap(mBitmap);
        }
    }
}

当Activity finish后 handler对象还是在Message中排队。 还是会处理消息,这些处理有必要? 
正常Activitiy finish后,已经没有必要对消息处理,那需要怎么做呢? 
解决方案也很简单,在onDestroy的时候,取消掉该Handler对象的Message和Runnable。 
removeCallbacks(Runnable r)和removeMessages(int what)等。

@Override
public void onDestroy() {
    //If null, all callbacks and messages will be removed.
    mHandler.removeCallbacksAndMessages(null);
}

文章来源:https://blog.youkuaiyun.com/demonliuhui/article/details/80164636

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分) 在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。 阅读详情

相关推荐

带你学习Android中的ContentObserver

通过使用,开发者可以有效地监听系统设置的变化,例如屏幕亮度等。这种机制使得应用能够动态响应系统设置的更改,提升用户体验。在实现需要与系统设置交互的应用时,合理使用是非常重要的。

执剑人 1311

Android ---【内存优化】Handler 内存泄漏原因及解决方案

Handler造成内存泄露的原因。非静态内部类,或者匿名内部类。使得Handler默认持有外部类的引用。在Activity销毁时,由于Handler可能有未执行完/正在执行的Message。导致Handler持有Activity的引用。进而导致GC无法回收Activity。匿名内部类: 非静态内部类: 三、解决方法 静态内部类+弱引用 Activity销毁时,清空Handler中,未执行或正在执行的Callback以及Message。 四、内部类为什么会持有外部类的引用 这是因为内部类虽然和外部类写在同一个

梁同学与Android 8277

基于STM32的家用新风系统智能控制器 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了家用新风系统智能控制器的全功能开发,覆盖多传感器数据采集、双模式控制、PID调速、异常报警、掉电记忆等核心功能,全程采用保姆式无跳步教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 464

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

在Activity中,将Handler声明成非静态内部类或匿名内部类,这样Handle默认持有外部类Activity的引用。如果Activity在销毁时,Handler还有未执行完或者正在执行的Message,而Handler又持有Activity的引用,导致GC无法回收Activity,导致内存泄漏。如以下两种情形可能导致内存泄漏。3:非静态内部类 + 弱引用,在activity要回收时清除引用(麻烦,不推荐)1、在Activity内将Handler声明成匿名内部类。1、静态内部类 + 弱引用。

xiaowang_lj的博客 2863

Spring WebFlux响应式编程实战(三):优雅处理异常与高效调试技巧

本文深入探讨了Spring WebFlux响应式编程中的异常处理与调试技巧。文章通过电商订单流处理场景,详细解析了Reactor核心操作符onErrorReturn、onErrorResume和onErrorMap的实战应用,并介绍了如何构建@ControllerAdvice和WebExceptionHandler全局异常处理防线。同时,提供了使用.log()操作符、Hooks.onOperatorDebug()及BlockHound进行高效调试的方法,旨在帮助开发者构建健壮、可维护的响应式应用。

weixin_29252171的博客 67

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

Handler内存泄漏详解及其解决方案

在android开发过程中,我们可能会遇到过令人奔溃的OOM异常,面对这样的异常我们是既熟悉又深恶痛绝的,因为造成OOM的原因有很多种情况,如加载图片过大,某已不再使用的类未被GC及时回收等等......本篇我们就来分析其中一种造成OOM的场景,它就是罪恶的内存泄漏。对于这样的称呼,我们并不陌生,甚至屡次与之"并肩作战",只不过它就是一个猪队友,只会不断送塔....... 本篇分为3部分:

zejian的博客 4万+

基于Simulink的前馈解耦SVPWM整流器仿真

本文提出了一种基于Simulink的前馈解耦SVPWM整流器仿真方案,针对传统双闭环控制存在的耦合严重、电压利用率低等问题进行优化。通过前馈补偿dq轴耦合项(ωLiq和ωLid)结合SVPWM调制算法,实现了电流跟踪误差<3%、电压利用率达0.99、THD<3%的性能指标。文章详细阐述了系统架构设计,包括前馈解耦原理推导、SVPWM算法实现步骤,并提供了完整的Simulink建模方法。仿真结果表明,该方案在动态响应速度(25ms)和直流电压纹波(1.1%)方面显著优于传统SPWM控制。同时给出了

MHD0815的博客 162

Handler 泄漏场景、解决方案、深入理解

摘要: Handler在Android开发中容易引发内存泄漏,特别是通过postDelayed()发布延时任务时。当Activity退出后,若延时任务未执行完毕,匿名内部类会持有Activity引用,导致Activity无法被GC回收。原因是Handler任务会被存入主线程Looper的MessageQueue中,而主线程Looper是静态对象(GC Root),形成引用链:Looper.sMainLooper → MessageQueue → Message → Runnable → Activity。解

Is_Poson的博客 2065

python 写一个简单的 telegram bot (电报机器人)

replit.com 环境配置太恶心了,只能使用 poetry.poetry 这个名字是挺好听,用起来也是很垃圾,太恶心。heroku.com 注册登录不方便,需要各种验证。所以,部署的问题,目前搁置。

waterHBO的博客 3197

AI漫剧全套万能提示词合集

今天给大家整理一套已经跑通爆款漫剧的万能提示词库!覆盖:豆包剧本人设词 + 分镜生成词 + 即梦绘图词 + 动态优化词 + 防翻车固定词直接复制粘贴,新手也能做出稳定、高清、统一、有质感的AI漫剧!你是资深短视频漫剧编剧,擅长制作60秒竖屏爆款AI漫剧,请为我创作一集完整漫剧内容。要求:开头3秒高能抓眼,中段有冲突转折,结尾留强悬念钩子,节奏紧凑、适合短视频流量。首先生成固定统一人物人设:包含脸型、五官、发色、发型、穿搭、身材、气质、画风、光影细节,要求足够精细,保证全程角色不变脸。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1911

android中handler内存泄漏解决方法,Android Handler内存泄漏详解及其解决方案

在android开发过程中,我们可能会遇到过令人奔溃的OOM异常,面对这样的异常我们是既熟悉又深恶痛绝的,因为造成OOM的原因有很多种情况,如加载图片过大,某已不再使用的类未被GC及时回收等等......本篇我们就来分析其中一种造成OOM的场景,它就是罪恶的内存泄漏。对于这样的称呼,我们并不陌生,甚至屡次与之"并肩作战",只不过它就是一个猪队友,只会不断送塔.......本篇分为3部分:1.Han...

weixin_34443284的博客 2608

YOLO26优化:注意力魔改 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 490

android 7.1内存泄漏,Android进阶7:Handler内存泄漏详解及其解决方案

在android开发过程中,我们可能会遇到过令人奔溃的OOM异常,面对这样的异常我们是既熟悉又深恶痛绝的,因为造成OOM的原因有很多种情况,如加载图片过大,某已不再使用的类未被GC及时回收等等……本篇我们就来分析其中一种造成OOM的场景,它就是罪恶的内存泄漏。对于这样的称呼,我们并不陌生,甚至屡次与之"并肩作战",只不过它就是一个猪队友,只会不断送塔…….本篇分为3部分:1.Handler内存泄漏...

weixin_29544469的博客 294

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Handler,Looper,Message原理关系,及解决Handler内存泄漏

Handler,Looper,Message原理关系,及解决Handler内存泄漏 本文主要讲述Handler机制的原理,和基本用法,通过Handler线程间通信 原理 Android消息机制:每个线程都有一个消息队列MessageQueue,用来存放和处理消息Message,Looper轮循器循环地从消息队列中取出消息,如果没有消息就阻塞,Handler用来封装消息发送,并通过对应的Looper...

cnsd_it_z的博客 575

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android Handler引起的内存泄漏+汇总

1.Handler 引起的内存泄漏 Handler是Andorid给我们提供的一套UI更新机制,同时它也是一套消息处理机制。 使用Handler消息处理机制在多个线程并发更新UI的同时 ,可以保证线程安全。 先看看下图: 出现了一大片黄色警告,what?怎么回事的。黄色警告的大概意思:Handler可能会内存泄漏,推荐使用静态内部类+实例化弱引用。在使用Handler时如果直接使用匿名内部类的方式创建Handler对象ide会发出警告,提示内存泄漏风险。 上图的Handler正是通过内部类创建的,它可能会

yanhuomatou2015的博客 917

Android开发——常见的内存泄漏以及解决方案(一)

0. 前言 Android的内存泄漏是Android开发领域永恒的话题,那今天就总结一下常见的内存泄漏吧。也给自己提个醒,在以后的编码过程中多注意这个问题。在Android Studio里可以通过一些分析工具比如MAT来找出潜在的内存泄漏。还有如果不清楚Java里的内存泄漏以及内存泄漏、内存益处的区别的小伙伴,可以参考我之前写过的Java技术——Java中的内存泄漏。此篇将从静态变量引用Acti...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Handler 引起的内存泄漏

关联文章: Android OOM 分析 Android异步消息处理线程之----Looper+MessageQueue+Handler Android 中Handler Android HandlerThread Handler sendMessage 与 obtainMessage (sendToTarget)比较 前言: 对于Handler 在android 系统引起的内...

私房菜 1012

handler内存泄漏情景分析

目录 前言 一、handler的几种创建方式 二、何时产生内存泄漏? 三、再谈handler内存泄漏 前言 一直以来,无论是在工作还是面试中,关于内存泄漏的话题,肯定是绕不开的。其中最典型的就是handler的内存泄漏问题,今天就带着大家一起探究一下handler内存泄漏的真正原因和场景。 一、handler的几种创建方式 先上图: 相信大家在平时开发过程中定义handler时,最常见就是以上这三种了。 第一种:直接使用匿名内部类 第二种:内部类方式 第三种:静态内部类.

baochengchen的博客 385

Android内存泄漏优化总结

Android内存泄漏优化总结什么是内存?Android中的内存是手机的RAM。主要包括如下几个部分: 1、寄存器 位于Cpu内部,速度最快。 2、栈 用于存放基本类型以及引用变量。 3、堆 主要用于存放数组和new出来的对象,它由垃圾回收器进行管理(GC)。对内存的优化也是处理的堆内存。 4、静态存储区 存储应用运行一直存在的数据(static变量) 5、常量池 存放定义的常

Coder_android 8504

Android Handler 避免内存泄漏的用法总结

Android开发经常会用到handler,但是我们发现每次使用Handler都会出现:This Handler class should be static or leaks might occur(null)这样的提示。Android lint就是为了提示我们,这样使用Handler会容易造成内存泄漏。但是你会发现其实改成static并没有什么用。因为这并没有解决这个问题的根本。 首先,我们得确认,为什么会有内存泄漏?因为Handler是基于消息的。每次new 出Handler,都会创建一个消息队列用于

weixin_51022898的博客 676

Android Handler 内存泄漏,文末消息机制的小总结

1. 内存泄漏的Activity public class MainActivity extends AppCompatActivity { private static final int MESSAGE_TYPE1 = 10; private Button mBtnSendMessage; private TextView mTvShow; private Handler m...

weixin_30436891的博客 88

Android 关于Handler内存泄漏的那些事

在上一篇文章《Android Handler机制完全解析》中,我们从源码的角度分析了Hanlder机制,接下来继续学习Handler,本篇文章主要讲解的是Handler可能会导致的内存泄漏以及解决方案。1.为什么会发生内存泄漏在平时使用Handler的时候,我们通常会这样定义:// 定义一个Handler对象,并实现handleMessage方法 Handler handler = new Hand

YangLe 697

从使用Handler致内存泄漏角度源码追踪Handler工作机制(配动画)

使用Handler时内存泄漏分析在Android中,处理完异步任务后常常会在主线程进行一些操作,所以我们可能会使用到Handler,下面是Handler的常见使用方法:public class MainActivity extends AppCompatActivity { private Handler mHanlder = new Handler() { @Override

不若乘风来 2549

java内部类内存泄漏,Android中常见的内存泄漏和解决方案

什么是内存泄漏?简单点说,就是指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏。为什么会产生内存泄漏,内存泄漏会导致什么问题?相比C++需要手动去管理对象的创建和回收,Java有着自己的一套垃圾回收机制,它能够自动回收内存,但是它往往会因为某些原因而变得“不靠谱”。在Android开发中,一些不好的编码习惯就很可能会导致内存泄漏,而这些内存泄漏会导致...

weixin_35683697的博客 224

Android Handler使用介绍

Android 中的 Handler 是用来和线程通信的重要工具。它主要用于在后台线程中执行任务,并将结果传递回主线程以更新用户界面。

小旭的专栏 3603
上一篇: 客户端发给定向发送消息 - 连接封装
下一篇: Android进程间通信的几种方式
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值