当前位置: 首页 > news >正文

Android中的EventBus的用法

1. EventBus简介

EventBus是一个优化了的事件发布/订阅模式实现的库,常用于Android程序组件间的通信。它可以简化不同组件之间的通信工作,避免复杂和耦合的依赖关系。EventBus通过事件驱动来降低代码耦合度,提高开发效率和代码清晰性。
在这里插入图片描述


2. EventBus的安装

要在Android项目中使用EventBus,首先需要加入相应的依赖。打开项目的build.gradle文件,在dependencies部分添加以下代码:

dependencies {implementation 'org.greenrobot:eventbus:3.3.1'
}

请注意检查最新版本号以获得最好的功能支持和稳定性。


3. 基本使用方法

3.1 定义事件

首先,定义一个事件类,这个类可以是任意普通对象。

public class MessageEvent {public final String message;public MessageEvent(String message) {this.message = message;}
}

3.2 注册和注销事件监听

在需要接收事件的组件(如Activity或Fragment)中注册和注销EventBus。

@Override
protected void onStart() {super.onStart();EventBus.getDefault().register(this);
}@Override
protected void onStop() {EventBus.getDefault().unregister(this);super.onStop();
}

3.3 订阅事件

在接收事件的组件中声明一个用@Subscribe注解的方法,该方法的参数类型应为你定义的事件类。

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {textView.setText(event.message);
}

threadMode 属性指定处理事件的线程。主流选项包括:

  • MAIN:在UI线程执行。
  • BACKGROUND:在后台线程执行。
  • ASYNC:在单独的线程执行,适用于并行处理。

3.4 发送事件

从任何地方发送事件很简单,只需要调用post方法。

EventBus.getDefault().post(new MessageEvent("Hello, EventBus!"));

4. 高级特性

4.1 粘性事件(Sticky Events)

粘性事件允许晚于事件发布者注册的订阅者仍然接收事件。发送粘性事件如下:

EventBus.getDefault().postSticky(new MessageEvent("Sticky Event"));

接收粘性事件时,需要添加sticky = true属性:

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(MessageEvent event) {textView.setText(event.message);
}

4.2 事件优先级(Priority)

你可以通过设置priority来控制接收事件的优先级:

@Subscribe(threadMode = ThreadMode.MAIN, priority = 100)
public void onHighPriorityEvent(MessageEvent event) {// 处理高优先级事件
}

4.3 取消事件传递(Cancelling Events)

在某些情况下,你可能想要停止事件继续传递:

@Subscribe
public void onEvent(MessageEvent event) {EventBus.getDefault().cancelEventDelivery(event);
}

5 工具和调试

EventBus提供了一套工具来帮助调试事件传递。使用EventBusBuilder配置EventBus实例时,可以启用调试模式:

EventBus.builder().logNoSubscriberMessages(true).sendNoSubscriberEvent(true).installDefaultEventBus();

6. EventBus的替代方案

尽管EventBus在Android社区中非常流行,但还有其他几种可以考虑的通信方式,比如使用RxJava、LiveData以及其他基于观察者模式的库。


7. 总结

EventBus是一个简单而强大的工具,可用于解耦Android应用的各个部分。正确使用它可以使代码更加简洁和容易管理。然而,像所有的工具一样,合适的情景下使用它非常重要,并对其局限性有所了解。

相关文章:

Android中的EventBus的用法

1. EventBus简介 EventBus是一个优化了的事件发布/订阅模式实现的库,常用于Android程序组件间的通信。它可以简化不同组件之间的通信工作,避免复杂和耦合的依赖关系。EventBus通过事件驱动来降低代码耦合度,提高开发效率和代码清晰性。 2. …...

梧桐数据库(WuTongDB):数据库在数据处理中是如何利用缓存机制的

数据库在数据处理中利用缓存机制主要是为了提高数据访问速度和系统性能。缓存机制通过将频繁访问的数据存储在内存中,减少了对磁盘I/O操作的需求,从而提高了数据查询的效率。以下是数据库利用缓存机制的一些主要方式: 1. 查询缓存&#xff0…...

C语言-数据类型

在x64编译器平台下,C语言数据类型的取值范围主要取决于数据类型的大小(即字节数)以及它们是有符号的还是无符号的。以下是根据常见实现总结的x64平台下C语言数据类型的取值范围: 整数类型 浮点类型 指针类型 在x64编译器平台下…...

左值引用、右值引用、移动构造

1、为啥使用引用? // An highlighted block void function(string str) {... ... }看上面这段代码,如果不采用引用的方法,那么在函数被调用的时候,编译器会有一个参数赋值的过程,这就导致了内存和效率的浪费。 // An…...

tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink

分析: 如果ceph的mountPath和workingDir路径一致的话,就会报错。 解决:node_modules挂载到/workspace下,workingDir的代码mv到/workspace下进行构建。...

Xil_DCacheFlushRange的用法

概述: 当使用Zynq的PS (Processing System) 与PL (Programmable Logic) 进行通信时,特别是涉及到高速数据传输时,可能会遇到缓存一致性问题。这是因为处理器系统通常具有缓存机制来加快对常用数据的访问速度,但在某些情况下&…...

k8s使用subpathexpr和hostpath分pod名字持久化日志

在k8s中,服务日志除了标准输出,还有写入日志文件,若要对这些日志文件进行持久化存储,无论是通过网络文件存储还是hostpath,都会面临一个问题,多个pod会往同一个存储目录的同一个文件进行写入,导…...

FChen的408学习日记--三次握手和四次握手

一、三次握手 在建立连接的过程中,首先SYN1,随机发送sqex。服务器接受后要反过来对客户端发送连接请求,SYN1,随机发送sqey,ackx1。然后客户端还要发送连接确认报文,原因如下 例题: 二、四次…...

Unity技巧:轻松实现鼠标悬停文本时的动态变色效果

文章目录 前言一、Text二、TMP_Text二、颜色转换总结 前言 在游戏或应用中,给用户的界面添加一些小的互动效果能让它们更加吸引人。比如,当策划要求你这样做的时候 ,当用户将鼠标悬停在文字上时,文字颜色改变,这样的效…...

谷歌账号活动异常,或者申诉回来以后需要手机验证的原因,以及验证手机号的错误操作和正确操作

有一些朋友在使用谷歌账号的时候,会遇到无法直接登录的情况,输入用户名、密码以后,提示说账号活动异常,需要验证手机号。 通常有以下两种情形和界面,出现这种情形的原因分别如下。 一、谷歌账号登录需要输入手机号码…...

System V IPC奥秘:解锁共享内存、消息队列与信号量的高效通信之路

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑system V共享内存 🍒共享内存的原理共享内存数据结构查看和删除共享内存资源的命令 🌻共享内存…...

怎么将pdf转为ppt文件?pdf转ppt的8个方法

在诸多职场与学术交流的场合中,我们时常面临将详尽的PDF文件转化为生动且易于编辑的PPT演示文稿的需求。这一转换不仅是为了满足演示时的灵活性,更是为了提升信息传递的效率与观众的理解度。从简单的在线工具到功能全面的专业软件,我们拥有多…...

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 人话八股文Bakwaan_Buddy项目开发尝试 Idea: 我们草台班子目前的想法是解决大家计算机学院毕业面临的BUG——不爱背、背不下来八股文,觉得枯燥、烦、工作了用不着,反正就是知识他不进…...

如何在wordpress当中使用插件WP Coder(将html、css、javascript应用到wordpress上)

了解认识阶段 安装并运行好WP Coder之后如下图: 设置全局PHP 禁用gutenberg 输入代码 add_filter(gutenberg_can_edit_post, __return_false, 10); add_filter(use_block_editor_for_post, __return_false, 10); 记得点击save并勾选enable PHP code 禁用之后打…...

ActiveMQ、RabbitMQ、Kafka、RocketMQ在消息回溯、消息堆积+持久化、消息追踪、消息过滤的区别

ActiveMQ、RabbitMQ、Kafka、RocketMQ在消息回溯、消息堆积持久化、消息追踪、消息过滤等方面各有其独特的特点和优势。以下是这四个方面的详细比较: 1. 消息回溯 ActiveMQ:支持消息回溯功能。ActiveMQ可以将消息持久化到磁盘上,因此当需要…...

使用ITextRenderer导出PDF后无法打开问题,提示‘无法打开此文件‘

依赖如下 <!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf --> <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.22</version> &l…...

STL必须掌握的几大常见算法

1. std::sort 功能:对容器中的元素进行排序。 用法: #include <algorithm> #include <vector>std::vector<int> vec = {3, 1, 4, 1, 5, 9}; std::sort(vec.begin(), vec.end());你知道sort内部用的什么排序吗 2. std::reverse 功能:将容器中的元素顺…...

HAproxy 七层负载均衡调度器详解及配置

HAproxy 七层负载均衡 负载均衡技术 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;一种服务&#xff0c;或基于硬件设备实现的高可用的反向代理技术&#xff0c;是指将特定的业务流量分摊给一个或多个后端的特定服务器或设备&#xff0c;实现高并发处理业务流量…...

Python学习笔记--私有属性、构造方法、析构方法、常用内置方法

目录 私有属性 构造方法 析构方法 常用内置方法 私有属性 1. 私有属性是指在类内可以直接访问、而在类外无法直接访问的属性 2. Python中规定&#xff0c;在定义类时&#xff0c;如果一个类属性名是以__&#xff08;两个下划线&#xff09;开头&#xff0c;则该类属性为私…...

4章8节:用R做数据重塑,行列命名和数据类型转换

在R语言中,行列命名和数据类型转换是数据处理中的两个基础性操作。它们不仅对数据的可读性和组织性至关重要,而且在执行数据分析、模型构建和结果解释时也扮演着重要的角色。 一、行和列命名 在数据科学和统计分析中,命名是组织和管理数据的一个重要部分。尤其是在处理复杂…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...