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

Android和Java的发布/订阅事件总线EventBus

EventBus 简介

EventBus是一种适用于Android和Java的发布/订阅事件总线。EventBus内部实现了高效的事件传递机制,能够快速将事件从发布者传递到订阅者。同时,EventBus还提供了错误处理机制,可以捕获和处理事件处理过程中的异常,确保应用的稳定性。

EventBus通过简化组件间的通信,实现了Activity、Fragment、线程以及服务之间的解耦。它使用发布/订阅模式,使得组件之间不需要直接依赖对方即可进行通信。EventBus不仅支持多种线程模式,如主线程、后台线程等,还提供了粘性事件和优先级设置,以适应不同的开发需求。

EventBus的使用非常灵活,开发者可以通过简单的注解来定义事件的发布者和订阅者。在需要发送事件的组件中,只需调用EventBus.post()方法即可发布事件;而在需要接收事件的组件中,则通过@Subscribe注解来标记事件处理方法。这种设计大大简化了代码结构,提高了开发效率。

EventBus 使用

增加依赖和事件类:

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

public class StickyEvent {
    private String message;

    public StickyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

准备订阅者

订阅者需要实现一个订阅方法,并使用@Subscribe注解修饰该方法。@Subscribe注解中的threadMode参数决定了使用的线程模型,目前一共有五种模式可供选择。ThreadMode.MAIN表示在主线程执行该方法。

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent message){
    //TODO 接收事件后Do something
}

注册与注销

在Activity或Fragment的生命周期方法中,如onStart()和onStop(),分别调用EventBus.getDefault().register(this)和EventBus.getDefault().unregister(this)来注册和注销订阅者。

发布事件:

使用EventBus.getDefault().post(Object)方法发布普通事件,或者使用EventBus.getDefault().postSticky(Object)方法发布粘性事件。粘性事件的特点是即使没有订阅者,事件也不会丢失,后续订阅者仍然可以接收到该事件。

处理消息:

在订阅方法中处理接收到的消息。例如,当接收到MessageEvent类型的事件时,可以在订阅方法中通过参数获取事件的具体内容,并进行相应的处理。

EventBus 粘性事件的使用

EventBus的粘性事件是一种在发布事件后,即使没有订阅者立即订阅,也能在后续订阅时接收到该事件的机制。以下是关于EventBus粘性事件的详细使用方法:

  1. 定义粘性事件:
    粘性事件可以是任何类型的对象,通常定义为一个Java类或接口。
    例如,定义一个简单的消息事件类MessageEvent,其中包含一个字符串字段用于传递消息。
  2. 发送粘性事件:
    使用EventBus.getDefault().postSticky(Object)方法发送粘性事件。
    粘性事件会被保存在EventBus的内部缓存中,直到被消费或手动移除。
import org.greenrobot.eventbus.EventBus;

// 发布粘性事件
EventBus.postSticky(new StickyEvent("Hello, EventBus!"));

  1. 订阅粘性事件:
    在需要订阅粘性事件的组件(如Activity、Fragment等)中,使用@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)注解标记订阅方法。sticky = true表示该方法订阅的是粘性事件,threadMode = ThreadMode.MAIN指定事件处理线程为主线程。
 // 处理粘性事件的方法
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onStickyEvent(StickyEvent event) {
        // 处理接收到的粘性事件
        String message = event.getMessage();
        // 显示消息或其他操作
        System.out.println("Received sticky event with message: " + message);
    }
  1. 手动处理粘性事件:
    除了自动分发外,还可以手动获取和处理粘性事件。
    使用EventBus.getDefault().getStickyEvent(Class)方法获取特定类型的粘性事件。
    如果需要移除粘性事件,可以使用EventBus.getDefault().removeStickyEvent(Object)或EventBus.getDefault().removeAllStickyEvents()方法。

http://www.kler.cn/a/413151.html

相关文章:

  • 实验三 z变换及离散时间LTI系统的z域分析
  • 【深度学习|目标跟踪】StrongSort 详解(以及StrongSort++)
  • Could not locate device support files.
  • FBX福币交易所创业板指放量大涨2.73% 谷子经济概念持续爆发
  • Python学习第十三天--面向对象,类和对象
  • Elasticsearch对于大数据量(上亿量级)的聚合如何实现?
  • 决策树——基于乳腺癌数据集与cpu数据集实现
  • 小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你
  • java语言同时处理多个数据以及计算百分比保留整数
  • 【C++】入门【一】
  • 基于SpringBoot+Vue的汽车票网上预订系统-无偿分享 (附源码+LW+调试)
  • 黑马程序员Java项目实战《苍穹外卖》Day01
  • 【NLP 3、深度学习简介】
  • 设计模式——服务定位器模式
  • MySQL大数据量优化:详解与示例
  • 二叉树:堆的建立和应用
  • 记连接不上虚拟机IP
  • 基于Java Springboot点餐系统
  • jsp的pageContext对象
  • iframe温习+应用
  • Android Cookie读写
  • nuxt3项目搭建相关
  • 26届JAVA 学习日记——Day16
  • Python图像处理:打造平滑液化效果动画
  • Vue: computed 计算属性
  • 11.27 深度学习-损失函数+BP算法