从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

相关文章

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

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、