EventBus系列之基本使用

本文深入讲解EventBus的使用,包括事件的订阅、发送与处理,探讨不同线程模型的应用场景,以及粘性事件的特性。适合希望提升Android应用内组件间通信效率的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

EventBus是一种发布/订阅事件总线,简单的说就是可以在应用程序各个组件之间进行通信。比如让我们有点烦扰的Fragment与Fragment之间的通信,EventBus具有开销小的有点,而且使用起来也非常优雅。

基本用法

EventBus组成

首先我们先来了解下EventBus的组成部分,主要分为以下几种。

  • Event:表示事件,也就是我们需要发送的内容
  • Subscriber:表示事件订阅者
  • Publisher:表示事件发送者,可以在任意线程和任意位置发送事件
    从上图可以看出EventBus从事件订阅到事件发送的具体过程,当某个订阅者订阅事件后,事件发送者发送事件后,订阅者就会收到事件。

创建Event事件

在使用一个开源库之前,第一件事情肯定是添加依赖,如下

implementation 'org.greenrobot:eventbus:3.1.1'
复制代码

然后为了能够发送事件,我们需要创建一个Event事件类。 public class MessageEvent {

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
复制代码

订阅事件

当我们使用EventBus发送事件时,第一步需要订阅事件。可能有的同学要问了,一定要订阅事件吗?答案是肯定的,如果不订阅事件的话,当我们发送事件的时候,谁来接收并处理事件呢?所以我们需要告诉EventBus,是谁来处理这个事件。

  EventBus.getDefault().register(LoginActivity.this);
复制代码

通过EventBus.getDefault()来实例化EventBus对象,然后通过register()方法来订阅事件。

发送事件

 EventBus.getDefault().post(new MessageEvent("Hello EventBus"));
复制代码

从代码中可以看出,我们将需要发送的内容"Hello EventBus"传递到了Event事件中。然后通过post()方法来进行发送。

处理事件

 /**
   * 处理事件
   * */
    @Subscribe(threadMode = ThreadMode.POSTING)
    public void setEvent(MessageEvent messageEvent){
        textView.setText(messageEvent.getMessage());
    }
复制代码

现在我们需要详细的说一下EventBus是如何处理事件的。首先我们需要在处理事件的方法上添加"@Subscribe",这样就告诉了EventBus在哪里处理事件。然后还有一个"ThreadMode",表示线程模型。在EventBus中有四种线程模型,分别如下。

  • POSTING:默认线程模型,表示事件在哪一个线程中发送出来,就在哪一个线程中处理事件。比如在主线程中发送事件,然后就在主线程中处理事件。有可能会进行耗时操作,所以需要注意尽量不进行耗时操作,可能引起ANR。
  • MAIN:表示在主线程中处理事件,所以不能进行耗时操作,有可能引起ANR。
  • BACKGROUND:如果事件是在主线程中发送,那么会创建一个新的线程来处理事件。如果是在子线程中发送事件,那么就在该线程中处理事件。这里需要注意的是采用该线程模型,不能进行UI更新操作。
  • ASYNC:表示不管事件在什么线程中发送,都会创建一个新的线程来处理事件。因此,同样不能进行UI更新操作。

取消订阅事件

在处理事件后,肯定要取消订阅事件,代码如下

  EventBus.getDefault().unregister(this);
复制代码

粘性事件

以上是利用EventBus来发送一般的事件,在EventBus中还可以发送粘性事件。那什么粘性事件呢?简单的说就是在发送事件后,然后再订阅事件,最后依然能够收到发送的粘性事件。与上面我们学习的事件不同的是,粘性事件不需要一开始就订阅事件,在事件发送后再订阅事件。

发送粘性事件

  EventBus.getDefault().postSticky(new MessageEvent("你好啊,我是粘性事件"));
复制代码

可以看出我们使用了postSticky()方法来发送粘性事件。

处理事件

 @Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
 public void setStickyEvent(MessageEvent messageEvent){
     textView.setText(messageEvent.getMessage());
    }
复制代码

总结

通过对EventBus基本用法的学习,初步了解了EventBus的使用流程。当然作为一个爱学习的人,光知道怎么使用是远远不够的。下一篇我们将来学习EventBus的源码流程,加油!

转载于:https://juejin.im/post/5c2f549a5188252552514287

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值