【EventBus】EventBus的基本用法

news2024/11/16 17:36:34

一、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() {
    @Override
    public void onClick(View view) {
        EventBus.getDefault().postSticky(new EventMessage("刚刚从直播界面退出了"));
        finish();
    }
});

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程&#xff0c;其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…

(C++)只出现一次的数字III--异或

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

【桌面应用开发】Tauri是什么?基于Rust的桌面应用

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

NGROK内网穿透工具-实战+源码下载

1、功能概述&#xff1f; 本案例中使用ngrok内网穿透工具&#xff0c;使用方便&#xff0c;不需要注册等麻烦的操作&#xff0c;永久使用&#xff0c;一键搞定。 我们在项目中有这样一种需求&#xff1a; 甲方&#xff1a;汤工你能不能把你们正在开发的项目或者页面发给我看…

宏景eHR SQL 注入漏洞复现(CVE-2023-6655)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 中发现了一种被分类为关键的漏洞,该漏洞影响了Login Interface组件中/w_selfservice/oauthservlet/%2e../.%2e/genera…

了解网络攻击影响链的每个环节

通常很难完全理解成功的网络攻击的影响。有些后果显然是可以量化的&#xff0c;例如支付的赎金的数额。但其他后果并不那么明显&#xff0c;从客户信任和潜在业务的丧失&#xff0c;到数年后可能作为另一次网络攻击的一部分而出现的数据被盗。 这些都是网络攻击影响链的所有要…

Unity_C#中使用protobuf

Unity_C#中使用protobuf 下载官方protobuf地址&#xff1a; https://github.com/protocolbuffers/protobuf/releaseshttps://links.jianshu.com/go?tohttps%3A%2F%2Fgithub.com%2Fprotocolbuffers%2Fprotobuf%2Freleases protobuf-c#源码生成dll&#xff0c;导入unity 1.…

Linux权限篇

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

vue3 element-plus 日期选择器 el-date-picker 汉化

vue3 项目中&#xff0c;element-plus 的日期选择器 el-date-picker 默认是英文版的&#xff0c;如下&#xff1a; 页面引入&#xff1a; //引入汉化语言包 import locale from "element-plus/lib/locale/lang/zh-cn" import { ElDatePicker, ElButton, ElConfigP…

【Docker】使用docker-compose搭建django+vue工程文章

我们尝试使用docker-compose编排一个后端基于django,前端基于vue,数据库为postgresql并使用nginx进行反向代理的web工程。 工程准备 Docker 安装Docker 安装docker-compose django 在python3.7的环境下创建 修改settings.py文件 修改 将静态文件收集路径添加进 ,笔…

视频监控管理平台/智能监测/检测系统EasyCVR协议播放限制时长无效是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

福德植保无人机:绿色农业的新篇章

今天&#xff0c;我们荣幸地向您介绍福德植保无人机&#xff0c;一种改变传统农业种植方式&#xff0c;引领绿色农业的新科技产品。福德植保无人机以其高效、环保、安全的特点&#xff0c;正逐渐成为植保行业的新宠。福德植保无人机是一种搭载了高性能发动机和精确喷洒系统的飞…

使用Mockjs模拟(假数据)接口(axios)

一、什么是MockJs Mock.js官网 Mock.wiki.git mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 二、安装mockjs npm install mockjs 三、 MockJs使用 简单使用&#xff1a; // 使用…

Java SPI机制学习

最近阅读源码时看到了SPI加载类的方式 这里学习一下 SPI Service Provider Interface 服务提供接口 API和SPI区别 API是接口和实现类均有服务提供方负责 服务调用方更多是一种主动调用 只是调用SDK来实现某个功能&#xff1b;接口的归属权在于服务提供方 SPI是接口在调用方…

【UE5】监控摄像头效果(下)

目录 效果 步骤 一、多摄像机视角切换 二、摄像头自动旋转巡视 三、摄像头跟踪拍摄 效果 步骤 一、多摄像机视角切换 1. 打开玩家控制器“MyPlayerController”&#xff0c;添加一个变量&#xff0c;命名为“BP_SecurityCameraArray”&#xff0c;类型为“BP_SecurityCa…

【JVM从入门到实战】(二)字节码文件的组成

一、Java虚拟机的组成 二、字节码文件的组成 字节码文件的组成 – 应用场景 字节码文件的组成部分-Magic魔数 什么是魔数&#xff1f; Java字节码文件中的魔数 文件是无法通过文件扩展名来确定文件类型的&#xff0c;文件扩展名可以随意修改&#xff0c;不影响文件的内容。…

新能源汽车生产污废水需要哪些工艺及设备

新能源汽车的快速发展带来了许多环境问题&#xff0c;其中之一就是生产过程中产生的污废水。由于新能源汽车的生产过程与传统汽车有所不同&#xff0c;因此需要采用特定的工艺和设备来处理和处理这些废水。 首先&#xff0c;新能源汽车生产过程中产生的污废水主要来自洗涤和冷却…

[排序篇] 冒泡排序

目录 一、概念 二、冒泡排序 2.1 冒泡降序(从大到小排序) 2.2 冒泡升序(从小到大排序) 三、冒泡排序应用 总结 一、概念 冒泡排序核心思想&#xff1a;每次比较两个相邻的元素&#xff0c;如果它们不符合排序规则&#xff08;升序或降序&#xff09;则把它们交换过来。…

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)

WebAppDbTest 项目准备 项目准备1、.net cli 创建项目2、nuget 包引用和项目结构2.1、项目添加相关 nuget 包2.2、WebAppDbTest 项目结构 3、项目代码说明3.1、CSharp/C# 类文件说明3.2、json 配置文件说明 4、项目运行预览 数据库 .db 文件准备1、创建 SQLite 数据库1.1、在 W…

赛宁网安多领域亮相第三届网络空间内生安全发展大会

2023年12月8日&#xff0c;第三届网络空间内生安全发展大会在宁开幕。两院院士、杰出专家学者和知名企业家相聚南京&#xff0c;围绕数字经济新生态、网络安全新范式进行广泛研讨&#xff0c;为筑牢数字安全底座贡献智慧和力量。 大会围绕“一会、一赛、一展”举办了丰富多彩的…