Android开发中使用Handler类造成的内存泄露问题

PICO SCOPE 二次开发 基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集 阅读详情

在Android开发中,经常使用Handler来进行主线程(UI线程)与子线程间的消息传递工作,代码如下:

public class MyActivity extends Activity
{

        Handler mHandler = new Handler()
	{

		@Override
		public void handleMessage(Messagemsg)
                {
                    super.handleMessage(msg);

		{
		
	};


}

但这么做编译器会报一个警告:This Handler class should be static or leaks might occur 

意思是Handler应该创建成静态的,并且使用弱引用,否则可能造成内存泄露。这是由于非静态内部类会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。
解决办法是将Handler声明为static嵌套类,并且使用对外部类的弱引用。在此,顺便说一下什么是弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用常用来解决内存泄露问题。
代码如下:
static class MyHandler extends Handler 
{
                WeakReference<MyActivity> mActivity;
   
                MyHandler(MyActivity activity) 
                {
                        mActivity = new WeakReference<MyActivity>(activity);
                }
   
                @Override
                public void handleMessage(Message msg) {
                        MyActivity activity = mActivity.get();
                        switch (msg.what) {
                        case 0:
                               
                                break;
                        }
                }
}


保姆级教程:手把手教你用CANoe/CANalyzer读取汽车故障码(UDS 0x19服务实战) 本文提供了一份详细的CANoe/CANalyzer使用教程,指导如何通过UDS 0x19服务读取汽车故障码。从硬件配置到报文构建,再到故障码解析,手把手教你完成汽车诊断全流程,特别适合汽车电子工程师和诊断开发人员。 阅读详情

相关推荐

GPT大模型在数学建模中的实战应用:从思路启发到代码生成

数学建模是将现实问题抽象为数学问题并求解的核心方法,其关键在于通过合理的假设与简化,构建可计算的数学模型。传统建模依赖MATLAB等工具进行推演试错,而大语言模型的出现革新了这一范式。GPT等模型通过理解自然语言、辅助逻辑推理与代码生成,能有效提升建模效率与质量,在问题解析、模型构建、算法实现等环节提供关键支持。本文聚焦GPT在数学建模中的具体应用,涵盖赛题解读、模型推导、代码生成与结果分析,并结合实战案例,探讨如何将其作为“副驾驶”融入建模全流程,实现人机协同的智能化建模。

weixin_29061465的博客 324

Android开发——Handler引起的内存泄露

在Android异步消息处理中, Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // } }; 但当我们这么写时,编译器会给出警告提示:Handler类应该是静态的,可能发生

牧之 1601

Zemax:初学者的混合模式

光线以序列模式开始,然后接近非序列组件的入口端口。到达入口端口后,光线以非序列模式传播,然后接近出口端口。光线离开出口端口后,我们又回到序列模式。在此博客中,使用混合模式的示例将演示根据您自己的需要复制此工作流程所需的基本设置,以及一些有用的技巧。非序列组件表面类型必须在序列模式和非序列模式下定义。为了定义非序列组件的几何形状,请转到设置->编辑器->非序列,单击非序列编辑器。一旦我们进入非序列组件编辑器:表面 2 上的组件组,找到一个对象类型并进行定义。它能让您兼具序列模式的精确性和非序列模式的灵活性。

jkh920184196的博客 1341

Handler如何有效地避免内存泄漏?

温馨提示请拖动到文章末尾,长按识别「抽奖」小程序。现金红包等你来拿。1「小新」近来遇到了 Handler 的泄露,百思不得其解。2在正文开始之前,听「大师兄」讲述一段经历...

文淑的博客 837

【学习笔记】一文搞懂IEPE传感器

本文介绍了IEPE(集成电路压电式)传感器的工作原理及其在振动监测中的应用。通过压电效应原理,IEPE传感器将机械振动转换为电信号,内置电荷放大器将高阻抗电荷信号转换为低阻抗电压信号输出。还介绍了传感器的三轴测量结构、4mA恒流源供电机制以及灵敏度与量程的关系,并通过风扇实验演示了故障诊断过程。实验使用USB-3123采集卡和SRD-1104信号调理器,展示了正常与异常状态下的振动数据差异,验证了IEPE传感器在设备状态监测中的有效性。

m0_62969865的博客 2817

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9210

This Handler class should be static or leaks may occur (anonymous android.os.Handler)

如果在 Activity 中使用了非静态的匿名 Handler 类,lint 会提示 This Handler class should be static or leaks may occur (anonymous android.os.Handler) 匿名 Handler 类导致内存泄露的原因

banxiali的博客 4018

深度学习|卷积神经网络

介绍卷积神经网络基本理论,包括卷积层、池化层和全连接层,并阐述LeNet卷积神经网络的构建过程。

weixin_58243219的博客 5727

Android中Handler引起的内存泄露

转载:http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur/?droid_refer=random_recommend

做你所想,想你所做。 567

分位数回归和stata

分位数回归与stata 找了半天也没找到我想看的那种完整点的stata教程,只好自己写一个了… 参考教材:《用STATA学微观计量经济学》&《高级计量经济学及STATA应用_第2版》 第一部分 纯理论 更加详细的百度吧,很长很长,这里主要是拿来和ols比较。ols是均值回归,求解的方法是残差的平方最小,而这里就是对残差的绝对值用分位数做惩罚。(思想了解一下即可) 第二部分 Stata...

Joycezzz的博客 1万+

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 641

内部Handler类引起内存泄露

内部Handler类引起内存泄露 如果您在Activity中定义了一个内部Handler类,如下代码: 帮助 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class MainActivity extends Acti

429

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1312

从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)

Handler 每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部分人都是知其然却不知其所以然。今天看到Handler.post这个方法之后决定再去翻翻源代码梳理一下Handler的实现机制。 异步更新UI 先来一个必背口诀“主线程不做耗时操作,子线程不更新UI”,这个规定应该是初学必知的,那要怎么来解决口诀里的问题呢,这...

weixin_33698823的博客 132

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android Handler引起的内存泄漏分析与解决

在开发中我们经常用Handler来进行子线程修改UI界面,进程间通讯等等,在用的过程中稍不注意就有可能发出handler leaks的警告,即“This Handler class should be static or leaks might occur ..”的警告。Google给出的解释如下: Issue: Ensures that Handler classes do not hold on

粤语伶仃的专栏 683

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使Handler内部类导致内存泄露的解决方法

之前用AndroidStudio自带的代码分析出现的警告,说的是Handler导致内存泄露 Handler reference leaks the Handler should be static or leaks might occur (null) 出现这个提示的原因是有个Handler是内部类,并且是运行在主线程中的,我就是在Activity里有个内部类的Handler 因为调用H

0-0Xuan的专栏 566

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 内存泄露 原理思考

看了这么多年的博客,感觉也应该也做点啥,后期会不间断地整理分享各种知识点,共勉。 1 内存泄露? 如果一个对象不被任何引用所指向 还有如果一组对象中只包含互相的引用,而没有来自它们外部的引用 则该对象会在被GC发现的时候被回收。 2 产生以及处理 样例 Android开发中我们经常见到Handler、Runnable、AsyncTask等类,如果采用非静态内部类|匿名内部类的方式使用...

qq_20046095的博客 228

This Handler class should be static or leaks might occur 解决办法

首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导

wangchaoqi1985的博客 702

This Handler class should be static or leaks might occur Android

更新到ADT2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。           首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:           Look for handler leaks: This ch

android大牛MrJing 活动中心 5889

This Handler class should be static or leaks might occur Android (转)

This Handler class should be static or leaks might occur Android (转) 首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露。 具...

weixin_30402085的博客 74

Android中Handler弱引用工具类

经常会用到Handler,我们也清楚它会内存泄露,如果再View中使用,很难做到onDestroy( )中removeAllCallback(null),索性写个工具类,但是我在项目中使用时候,发现有被GC的风险。 /** * Created by ibalde.Wang on 2018/10/25 12:10 */ public class HandlerUtils { priva...

iblade的博客 2393

安卓常见内存泄露解决办法

1:如果有打开Dialog,一定要在Activity的Destroy释放,否则有可能造成Activity异常退出时的内存泄露。 @Override  protected void onDestroy()  {     super.onDestroy();     if (progressDialog != null) {      progressDialog.dismiss();

北方的天空 805

声明ViewHolder(或Handler)内部类时,建议使用static关键字的原因

1、首先理解静态内部类和非静态内部类的主要区别之一。非静态内部类会隐式持有外部类的引用,就像大家经常将自定义的adapter在Activity类里,然后在adapter类里面是可以随意调用外部activity的方法的。当将内部类定义为static时,就调用不了外部类的实例方法了,因为这时候静态内部类是不持有外部类的引用的。声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用

SPENCER_HALE的博客 1411

Android学习之 关于内部Handler类引起内存泄露

今天在oschina上有看到一篇

小吕丶Code阶区 1777
上一篇: Java中equals()和hashCode()
下一篇: Android小技巧1——扩大控件的点击范围
IDTC
博客等级 码龄15年 22粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值