从This Handler class should be static or leaks might occur!警告说起

2024-04-14 09:08

本文主要是介绍从This Handler class should be static or leaks might occur!警告说起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      对于接下来讨论的问题,首先需要弄明白一个问题就是什么是内存泄漏:一般来说内存泄漏有两种情况。一种情况如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以Java 中的内存泄漏,主要指的是第二种情况。        

      首先我们来理解这个警告(This Handler class should be static or leaks might occur),该警告是告诉我们内存会泄露,到底是怎么泄露的呢?!我们还是用个简单的例子来说明吧。

该图表示的是现在所报的警告

       现在我们用个实例来说明警告的具体解释是怎样的!

       首先我构建了一个内部类MsgHandler, 内部类实例保存了一个对其外部类实例的引用,你不需要通过new的方式生成一个,获得该引用的方法是MainActivity.this(即外部类名.this),并且该引用是强引用(这里就涉及到你需要去了解下java机制里面的引用中所涉及到的强引用,弱引用,以及随机引用的具体内容).

       其次是,当我使用MsgHandler实例的sendMessage方法的时候,会把消息发送到主进程的详细队列里面去,在sendMssage发送的消息里面包含对该MsgHandler实例的引用,所以主进程的消息队列里也就有了对MsgHandler实例的引用。

      如果出现这种场景就可能会内存泄露,当发送到消息队列的消息还没来得及处理,而此时MainActivity的已经不需要再使用了,调用finish()方法,来结束期生命周期,可此时在消息队列里还有一条消息没有处理,并且此条消息包含这个MsgHandler实例的引用,所以这个MsgHandler的实例还是可以触及的对象,所以其还不能被回收,又因为该MsgHandler实例包含了MainActivity 的强引用,所以其也不能被回收,就造成了内存泄漏。

解决该问题:通过弱引用的方式来解决该问题。

这里呢我们先通过该篇文章来解释下java的各种引用.

http://www.cnblogs.com/theo/p/6443493.html


这篇关于从This Handler class should be static or leaks might occur!警告说起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902633

相关文章

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

zabbix6.4连接钉钉发出警告

zabbix6.4配置钉钉告警 注册钉钉 建一个内部群 添加自定义机器人 配置zabbix服务端 打开脚本告警的配置 # vim /etc/zabbix/zabbix_server.conf                 AlertScriptsPath=/usr/lib/zabbix/alertscripts 准备脚本 安装一个依赖包 # dnf -y insta

在项目SSH整合时,启动测试时报的警告!

一、tomcat 运行过程中提示: 22:11:07,082 [main] WARN  DTDEntityResolver : recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

java基础总结08-面向对象4(static关键字)

原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享。 静态成员变量与非静态成员变量的区别 以下面的例子为例说明 package cn.galc.test;public class Cat {/*** 静态成员变量*/private static

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

webservice的安全机制2---handler实现

本节摘要:本节介绍使用handler的方式来实现webservice的IP地址的校验。   1.引言 前一节介绍了使用users.lst文件来实现webservice的用户名和密码的校验, 本节介绍使用webservice的handler来实现webservice的安全校验。 这里,不用用户名和密码来实现安全校验,换一种方式,采用IP地址校验的方式。 这里通过一个配置文件来控制是否打开

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x&... 有时,有两个或多个类,其功能是相同的,仅仅是数