EventBus注销的必要性,用实例说明为什么EventBus用完必须注销

EventBus使用演示及实践案例 本文还有配套的精品资源,点击获取 简介:EventBus 是一个高效的 Android 事件分发库,用于简化组件间通信。本篇将展示如何通过演示项目来理解EventBus的核心概念、安装配置、创建事件类、订阅事件、以及注册和注销订阅者等关键步骤,并演示如何发布事件。通过本Demo,开发者可以掌握EventBus在实际Android开发中的应用。 1. EventBu... 阅读详情
//我们知道eventbus非粘性订阅事件在退出时都需要进行注销,否则会出现异常。那么到底会出现什么异常呢?
//下面我们用具体的实例来看一下。
package com.demo.staticman.eventbusdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        EventBus.getDefault().post(new TestEvent());
    }

    @Subscribe(threadMode = ThreadMode.POSTING)
    public void printLog(TestEvent testEvent) {
        Log.i("测试订阅事件的次数", "执行了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();//这里我们不进行eventbus订阅事件的注销
    }
}
 
我们第一次进入MainActivity时控制台log输出为下图所示:

可以看到订阅事件只执行了一次,那么我们现在退出MainActivity,清空控制台并再次进入,控制台输出为下图:

这里我们可以看到订阅事件被执行了两次,因为第一次注册的订阅事件未被注销,所以一直存在于进程中,我们
第三次进入打印结果为下图:


所以我们可以得出结论,若EventBus未被注销,那么会导致订阅事件的重复执行。

可能会有同学感到疑问,为什么MainActivity退出了,也就是说整个App都推出了,EventBus订阅事件还会存在于内存中呢,
这里科普一下,我们的确是退出了MainActivity,然而注意我们就只是退出了这个Activity,这个与在App中退出其他
Activity无异,并不能结束整个进程,而EventBus是全局的,这也就是为什么EventBus可以从任意一个角落传递任意事件到
另外的任意一个角落,所以仅仅退出应用并不能销毁全局变量。若我们在onDestroy中主动杀死进程,就可以销毁所有的全局
变量了。即:
@Override
protected void onDestroy() {
    super.onDestroy();//这里我们不进行eventbus订阅事件的注销
    android.os.Process.killProcess(android.os.Process.myPid());//在这里杀死进程
}
EventBus框架在Android应用中的集成与应用实例分析 EventBus是一种用于Android和Java的发布/订阅事件总线框架。它允许组件之间进行松耦合的通信,简化了组件之间的通信,特别适用于Android开发中组件间的通信。EventBus通过注解的方式来定义事件,使用方便且效率高。发布/订阅模式是一种消息传递机制,允许发布者(发布者)将消息或事件发送到订阅者(消费者),而不需要直接知道彼此的身份。这个模式由三个核心组成部分构成:事件(Event):消息本身,通常是一个自定义类,携带有关发生事件的数据。发布者(Publisher) 阅读详情

相关推荐

SPM12最新安装教程:Matlab2021a用户必看的路径配置技巧

本文为Matlab2021a用户提供SPM12的深度安装与路径配置指南。针对新版Matlab的路径管理变化,详细解析了传统方法失效的原因,并推荐通过创建startup.m文件实现SPM12路径的永久化、自动化配置,确保神经影像分析环境的稳定与高效。

weixin_29061509的博客 315

事件总线eventBus

事件总线

m0_65638748的博客 811

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

vue自动销毁的eventBus

我们通常在使用非父子组件间通信时,采用new Bus()的方式来做一个事件广播。 但一个弊端就是,这种方式并不会自动销毁,所以为了避免回调函数重复执行,还要在destroyed周期中去做Bus.$off('event name', fn)的操作。 这样带来的冗余代码就是: $on 的回调函数必须是具名函数。不能简单的Bus.$on('event name', () => {})使用匿名函数作为回调了,所以需要将回调函数放到metheds中进行额外的声明 在destroyed生命周期中去销毁事件的监听

weixin_43737327的博客 2724

从零搭建uniapp+vue3+ts+tailwindcss多端兼容开发环境

本文详细介绍了如何从零搭建uniapp+vue3+ts+tailwindcss多端兼容开发环境,包括环境准备、TailwindCSS集成、小程序兼容性解决方案以及样式优化技巧。通过实战步骤和常见问题解答,帮助开发者快速掌握这套技术栈,提升开发效率。

weixin_28693309的博客 324

Ubuntu本地部署CodeX编程助手:CLI配置全指南

本地AI编程助手是当前开发者关注的核心技术趋势,指在不依赖云端API、保障代码隐私前提下,于本地环境运行具备代码理解、多语言补全与知识库检索能力的智能辅助工具。其技术原理涉及模型加载、API网关编排、向量数据库集成及系统级资源调度,关键价值在于可控性、低延迟与合规性。典型应用场景包括企业内网DevOps提效、边缘设备嵌入式开发支持,以及敏感代码场景下的离线编程增强。本文聚焦Ubuntu系统下基于CLI的手动配置路径,深入解析Ollama服务注册、Node.js版本锁定、API Key环境隔离及Qwen2.5

weixin_26804345的博客 596

Flutter入门系列-EventBus事件总线

EventBus事件总线

好好学习,天天向上 2998

解决 Clawdbot 对接 Minimax 出现 401 (Token is unusable) 的问题排查与修复

即便确认 API Key 有效且余额充足,该问题仍可能在 Clawdbot 中持续出现,而在其他工具(如 curl 或 Postman)中测试正常。

hampeter的博客 3076

记录一个不易发现的错之EventBus粗心没有注销

我有个叫测温的项目,退出不杀进程,重进apk,使用eventbus发送信息,接收到多遍,一开始以为是多次发送了,后来反复打印log发现并没有多次发送! 经过多次log发现只有在eventbus接收端才会出现多次接收的情况,得,神奇的一幕,退出重进几次,就多几次打印,后来翻看EventBus的文档发现,当EventBus在同一个对象注册多次,就会有多次接收到信息,以前一直没有在意过这种东西,一直到代码全部码完测试的时候才发现!既然找到问题就好解了!每次退出之前先注销EventBus即可 ...

沐的博客 6827

C# 上位机之海康工业相机开发(SDK)实战教程

海康工业相机的C#开发核心是基于MVS SDK的“初始化→枚举→连接→采集→释放”流程,其中图像回调处理和格式转换是关键。严格按照SDK文档处理设备类型(网口/USB)和像素格式;及时释放图像资源,避免内存泄漏;错误码是排查问题的重要依据(可参考SDK中的“错误码说明”文档)。掌握这些基础后,可结合机器视觉算法(如OpenCV)实现缺陷检测、尺寸测量等高级功能,构建完整的工业视觉系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 3834

医疗AI知识库更新慢?提示工程架构师用Agentic AI自动更新的策略

我们的目标是用Agentic AI替代传统更新流程中的“重复劳动”,让医疗知识库(以知识图谱为例)能自动跟踪最新医学进展,把“更新周期从数月缩短到数天”。从PubMed/指南数据库自动抓取新文献;用提示工程从文本中提取结构化医学知识;自动校验新知识与旧知识的冲突;将通过校验的知识写入知识图谱。拆问题:先讲医疗知识库更新慢的3大根源;给方案:用Agentic AI设计4个“小助手”解决问题;讲原理:每个小助手的工作逻辑+提示工程技巧;做实战。

AI 原生应用开发的博客 1062

vue使用eventBus时,关闭页面销毁该方法

由于eventBus的$on方法在创建后即使关闭该页面也不会自动销毁,所以会出现在a页面创建之后,b页面点击也触发a页面的方法。在两个页面使用同一个EventBus,会同时触发});二、解决思路在关闭页面或者切换路由触发beforeDestroy时,销毁掉该$on方法以免被其他页面误触},

q1740706590的博客 796

8年ES运维经验整理出的Elasticsearch运维手册(超实用)

k1 : 控制非线性词频率归一化(饱和),Elasticsearch中默认值为1.2。用人能看懂的话说就是词语在文档中出现的次数对于得分的重要性。例如说我觉得在某些场景,一个搜索词在文档中出现越多则越接近我希望搜索的内容,就可以将这个参数调大一点。b :控制文档长度对于分数的惩罚力度。变量b处于分母上,它乘以刚刚讨论过的字段长度的比值,Elasticsearch中的b 默认值为0.75。如果b较大,则文档长度相对于平均长度的影响更大。

yonggeit的博客 5276

Android EventBus接收不到事件(EventBus在Activity与fragment中注册注销位置)

碰到了EventBus发送的事件接收不到的情况,调试后发现是已经被注销的问题。 首先注册和注销应该在向Activity生命周期中相对应的位置,因为Activity生命周期就是相对应的调用的,如onCreate和onDestory,onStart和onStop,onResume和onPause,如果调用到了onStop,下次出现就会从onStart开始。所以在注册后要在其相对的生命周期进行注销。 不建议在onResume中,因为onResume出现的频率大,所以...

qq_37980878的博客 4886

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

EventBus3.0源码解析——05. unregister 注销

unregister (注销) unregister(Object subscriber) public synchronized void unregister(Object subscriber) { //获取当前Subscriber对象所缓存的所有eventType对象 //这里的eventType代表Subscriber对象中所有标记了@Subscribe的method ...

boolean的博客 466

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android eventbus fragment,Android EventBus接收不到事件(EventBus在Activity与fragment中注册注销位置)...

碰到了EventBus发送的事件接收不到的情况,调试后发现是已经被注销的问题。首先注册和注销应该在向Activity生命周期中相对应的位置,因为Activity生命周期就是相对应的调用的,如onCreate和onDestory,onStart和onStop,onResume和onPause,如果调用到了onStop,下次出现就会从onStart开始。所以在注册后要在其相对的生命周期进行注销。不建议...

weixin_30449853的博客 1489

EventBus源码阅读(22)-EventBus注销

在Activity销毁的时候,我们需要注销其注册的事件 此时调用的是unregister /** Unregisters the given subscriber from all event classes. */ public synchronized void unregister(Object subscriber) { List> subscribed

wbzwind的专栏 968

EventBus使用和说明

前一段时间,在项目中调解一个bug的时候,用到了EventBus~当时还不知道是怎么回事。后来文哥告诉我说是一个观察者模式的应用: 以下献上个人对EventBus的学习和基本使用: 首先,它是一个开源的框架,主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、线程之间传递消息。他的最牛逼优点是开销小,代码简洁,解耦代码。(

My life,my way 1106

深度探秘!Android EventBus 事件注册与注销管理模块全解析(12)

EventBus 是基于发布 - 订阅模式的事件总线库,其核心思想是将事件的发布者和订阅者进行解耦。在传统的 Android 开发中,组件之间的通信往往需要复杂的接口和回调机制,这不仅增加了代码的复杂度,还降低了代码的可维护性。而 EventBus 通过引入事件的概念,让发布者只需将事件发布到 EventBus 上,订阅者则可以订阅自己感兴趣的事件,当相应的事件被发布时,EventBus 会自动将事件分发给订阅者。这种模式使得组件之间的依赖关系大大降低,提高了代码的可维护性和可扩展性。

Android开发领域创作者 613

SpringBoot整合EventBus事件驱动

序言   在开发中,有时候会使用到发布订阅模式,之前一直以为只要MQ才能实现,后来了解到Spring也可以通过自己的Event事件来实现发布订阅,相比MQ功能会弱很多,但是也会相对简单很多。   Spring原生的使用方式,有兴趣的小伙伴可以研究一下。实际开发可以使用Guava的EventBus以及org.greenrobot的EventBus,两者名字相同,功能也很相似,我使用的后者greenrobot。 学习过程中踩的坑: 依赖分不清:各种博客都在说guava的EventBus是多么的厉害,但是使用的

南风知我意,吹梦到西洲 5723

EventBus详解及简单实例

EventBus:Github 使用优点: 1、简化了组件之间的通信 将事件发送者和接收者分离 在活动,片段和后台线程中良好 避免复杂且容易出错的依赖关系和生命周期问题 2、使代码更简单 3、很快、很小,具有交付线程,用户优先级等高级功能。 Event使用有三步 (1)定义事件 (2)准备订阅者:声明并注释您的订阅方法,可...

qq_36267404的博客 292

Android之EventBus源码解析

这里写目录标题一级目录二级目录三级目录 一级目录 二级目录 三级目录

lizhichao628的专栏 1533

Android最火的框架系列(八)EventBus

这么美好的周六,在加班中度过了,十一点了,把EventBus总结一下。EventBus是一套可灵活使用的Android组件间通信框架。不仅可以便捷的传递Java变量,也可以传递复杂的Java对象。EventBus的使用也比较简单,消息发布者只需要在合适的时机发送消息,消息接收者只需要通过注册,处理和注销三个步骤,即可完成对消息的接收和处理。 一.观察者模式 首先...

zhaojun的博客 2万+

EventBus源码解析一

IntentHandlerInterfaceAIDLMessenger1.3、思考。

2401_87034019的博客 1538

Android Fragment之间用EventBus进行传值

参考链接:https://blog.youkuaiyun.com/json_corleone/article/details/84570882 我用的eclipse,所以没有引入EventBus,把jar包放到工程下面的libs文件夹就可以直接使用了。 1、创建一个类,我要传两个String参数,所以构造方法有两个参数 public class EventS { public String m...

kangkang123_98的博客 3754

EventBus 3.0 源码简要分析

EvenBus 可以在不同模块间传递信息,减少接口的使用。 一、使用例子 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

yxhuang2008的专栏 2086
上一篇: 安卓底部导航栏菜单弹出属性动画
下一篇: jsonObject.getString()解析任意字段均可强转为string
StaticCoder
博客等级 码龄11年 1粉丝 6原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值