前言
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的源码流程,加油!