【EventBus】EventBus的基本用法

一、EventBus基本用法

目录

  • 前言
  • 1、EventBus要素与ThreadMode
  • 2、EventBus的基本用法
  • 3、EventBus的黏性事件

前言

EventBus是一款针对于Android优化的发布-订阅事件总线。它优化了各组件、组件与后台之间的通信,可以用于代替广播实现通信。

1、EventBus要素与ThreadMode

在使用EventBus之前我们首先了解EventBus的三要素和它的五种ThreadMode。

三要素如下:

  • 事件【Event】:可以是任何对象
  • 事件订阅者【Subscriber】:事件订阅者
  • 事件发布者【Publisher】:事件的发布者可以在任意线程发布事件

在这里插入图片描述

EventBus的五种ThreadMode如下:

  • POSTING(默认):如果事件处理函数使用了POSTING模型,那么这个事件在哪发出,事件处理函数就会在哪运行,也就是说发送线程和接受线程在同一个事件当中(意味着最少的开销,因为它完全避免了线程切换。)。 注意:避免耗时操作,因为他会阻塞事件的传递导致ANR
  • MAIN:处理事件会在Ui线程中执行,所以需要避免线程处理时间过长,如果发布线程是主线程,将直接调用订阅者方法,阻塞发布线程。否则,事件将排队等待交付(非阻塞)也就是说事件执行顺序不受控制,可能会与它们被发布的顺序不一致。
  • MAIN_ORDERED:这个模型下,处理事件同样会在 Ui被调用。与 MAIN 不同的是,处理接收该事件是串行的,第二个订阅者需要在第一个订阅者处理完后才会接收到事件,所以被称为 ordered。这个模型同样要避免阻塞主线程。
  • BACKGROUND:处理事件会在后台线程执行, 如果发布事件是Ui线程那么处理事件会新开一个线程,如果发布事件是子线程那么处理事件还是在该子线程。注意:在处理函数禁止Ui操作
  • ASYNC:异步操作,无论事件在哪个线程发布,该事件的处理函数都是会在新的子线程执行;同样在处理函数禁止Ui操作。

2、EventBus的基本用法

首先导入依赖:EventBus项目地址

implementation "org.greenrobot:eventbus:3.3.1"

EventBus的使用分为五步。

(1)、自定义一个事件类

在组件化中通常将这个事件类放在libBase中,并且类的命名加上Event

public class EventMessage {String account;public EventMessage(String account) {this.account = account;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}
}

(2)、在需要订阅事件的地方注册事件

事件订阅者通常在onCreate中注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);viewText = findViewById((int) R.id.logView);EventBus.getDefault().register(this);
}

(3)、发送事件

事件发布者在任意地方发布事件

EventBus.getDefault().post(new EventMessage("刚刚从验证界面退出了"));

(4)、处理事件

在刚才订阅事件的类中进行处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void showEventMessage(EventMessage message)   {viewText.setText(message.getAccount());
}

处理方法可以随意命名但是需要添加上@Subscribe,并且还要指定线程。

(5)、取消事件订阅

事件订阅者通常在onDestroy中取消事件

@Override
protected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);
}

(6)、ProGuard混淆规则

在项目的混淆文件中,加入EventBus 的混淆规则,这个千万别忘了,不然会出现debug版本测试OK,release版本subscriber 收不到消息等诡异Bug。

-keepattributes *Annotation*
-keepclassmembers class ** {@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {<init>(java.lang.Throwable);
}

使用后效果展示如下:

3、EventBus的黏性事件

除了发送普通事件外,EventBus还支持发送黏性事件,就是在事件发送后再订阅该事件也可以收到事件。 这和黏性广播类似,我们修改刚才的代码:

(1)、处理黏性事件

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void showEventMessage(EventMessage message)   {viewText.setText(message.getAccount());
}

(2)、发送黏性事件

view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {EventBus.getDefault().postSticky(new EventMessage("刚刚从直播界面退出了"));finish();}
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/267402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt开发流程】之UI风格、预览及QPalette使用

概述 一个优秀的应用程序不仅要有实用的功能&#xff0c;还要有一个漂亮美腻的外观&#xff0c;这样才能使应用程序更加友善、操作性良好&#xff0c;更加符合人体工程学。作为一个跨平台的UI开发框架&#xff0c;Qt提供了强大而且灵活的界面外观设计机制&#xff0c;能够帮助…

如何在OpenWRT软路由系统部署uhttpd搭建web服务器实现远程访问——“cpolar内网穿透”

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

深度学习——第4.3章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.7 指数函数和对数函数 4.7 指数函数和对数函数 深度学习经常会用到Sigmoid函数和Softmax函数&#xff0c;这些函数是通过包含exp(x)的指数函数创建的。后面我们需要求解这些函数的导数。 4.7.1 指数 指数是一个基于“乘以某个数多少次”&a…

vite脚手架,配置动态生成路由,添加不同的layout以及meta配置

实现效果&#xff0c;配置了layout和对应的路由的meta 我想每个模块添加对应的layout&#xff0c;下边演示一层layout及对应的路由 约束规则&#xff1a; 每个模块下&#xff0c;添加对应的 layout.vue 文件 每个文件夹下的 index.vue 是要渲染的页面路由 每个渲染的页面路由对…

Xxl-Job在Linux环境下安装部署

文章目录 Xxl-Job简介环境准备安装下载安装包解压安装包初始化数据库文件修改配置文件打包启动 访问 Xxl-Job简介 Xxl-Job是一个分布式任务调度平台&#xff0c;作者是美团的研发工程师许雪里&#xff0c;Xxl命名的由来盲猜是作者的名字首字母&#xff0c;Job为任务。 环境准…

人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测

目录 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.人体关键点检测模型训练 4.人体关键点检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &#xff08;2&#xff09; 将ONNX模型转换…

串口通信(1)-硬件知识

本文讲解串口通信的硬件知识。让读者快速了解硬件知识&#xff0c;为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…

语音验证码的使用场景

相较于短信验证&#xff0c;语音验证是一种特殊的验证方式&#xff0c;目前在“用户注册”场景下更多的是作为短信验证码的一种补充&#xff0c;当收不到短信时&#xff0c;用户可以选择接听电话的方式来获取验证码&#xff0c;最大程度上避免用户流失。 在一些需要验证用户身…

涵盖多种功能,龙讯旷腾Module第五期:电化学性质

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

Diffusion 扩散模型

Diffusion 扩散模型 对比 GAN 和 VAE扩散原理扩散过程&#xff1a;加噪声&#xff0c;均匀分布到整个空间重参数&#xff1a;避免梯度消失、爆炸 复原过程&#xff1a;去噪声&#xff0c;恢复原始图像损失函数&#xff1a;交叉熵损失&#xff0c;变分推断 训练流程 对比 GAN 和…

Linux权限篇

1.什么是权限&#xff1f; 生活中&#xff0c;有些事情你不能做&#xff0c;别人能做&#xff0c;这叫别人有做某事的权限&#xff1b; Linux中&#xff0c;权限的概念也是类似的&#xff0c;特指通过一定的条件&#xff0c;拦住一部分人&#xff0c;给另一部分人权限去访问资…

多目标跟踪数据集

目录 DanceTrack数据集 自己改进的可视化代码: DanceTrack数据集 DanceTrack 是一个大规模的多对象跟踪数据集。用于在遮挡、频繁交叉、同样服装和多样化身体姿态条件下对人进行跟踪。强调运动分析在多对象跟踪中的重要性。 GitHub地址:https://github.com/DanceTrack/Dan…