概述
EventBus是一款发布/订阅时间总线,使用观察者模式。可以轻松实现在Android各个组件之间传递消息,可以降低代码的耦合度。
怎样使用
1.首先要定义一个消息类
public class Message{
//在这里实现消息的内容属性和getter、setter
}
2.在订阅事件的地方注册事件,即订阅观察者
EventBus.getDefault().register(this);
3.在产生消息的地方发送事件
EventBus.getDefault().post(message) //message即为消息对象
4.接收并处理消息,即观察者
@Subscribe(threadMode = ThreadMode.PostThread)
public void XXX(Message message) {
... //在这里实现处理消息的逻辑
}
其中注解是为了指定线程模型,在下面会对线程模型有介绍
5.取消对消息的订阅
EventBus.getDefault().unregister(this);
线程模型
线程模型即指定事件处理方法所运行的线程,EventBus一共有四种线程模型,分别为PostThread(默认)、MainThread、BackgroundThread和Async。
- PostThread:使用该模式,事件从哪个线程发出,那么就在这个线程处理。
- MainThread:在此模式下,不论事件从哪个线程发出,它都会在UI线程进行了处理,意味着可以在处理时间的方法中进行UI的更新,同时要注意不能进行耗时的操作,有可能会引起ANR。
- BackgroundThread:分两种情况:1.如果事件从UI线程发出,那么EventBus会创建一个新的线程并把处理方法在其中运行;2.如果事件从非UI线程发出,那么事件直接在该线程中处理完成。需要注意的是在这种模式下不能进行UI更新操作。
- Async:在这种模式下,事件无论从什么线程发出,都会创建一个新线程处理。
粘性事件
粘性事件概念
EventBus支持发送粘性事件。粘性事件类似于粘性广播,即如果在事件发生时未订阅该事件,而是在发生之后才进行对该事件的订阅,观察者仍能接收到订阅之前发生的事件。注意:如果在订阅之前发送了多条事件,那么只能接收到发送的最后一条事件。
粘性事件与普通时间区别
- 事件处理方法:
@Subscribe(sticky = true)
public void XXX(Message message) {
......
}
即需要在注解中添加sticky = true
. - 发送粘性事件:
EventBus.getDefault().postSticky(new Message("test"));
- 其他方法与普通事件并无区别