EventBus

响应式框架

Posted by Cc1over on September 6, 2018

EventBus

EventBus事件主线由四大部分组成:
1) Publisher发布者:用于分发我呢吧的Event事件,在EventBus中通过post方法进行分发传送
2) Subscriber订阅者:用于接收我们的事件,我们在订阅事件中处理我们接收的数据
3) Event事件:任何一个对象都可以作为事件,比如任何字符串,事件是发布者和订阅者之间的通信载体
4) EventBus:类似于中转站,将我们的事件进行对应的分发处理

EventBus的基本使用

1)添加依赖

     implementation 'de.greenrobot:eventbus:3.0.0-beta1'

2)定义一个消息类,该类可以不继承任何基类也不需要实现任何接口

public class MessageEvent {
 ......
 }

3)注册,与Android的广播机制类似,这个过程需要在activity中注册evetbus事件,然后定义接收方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

}
@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

4)产生事件,即发送消息

EventBus.getDefault().post(messageEvent);

5)处理消息 在3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型,下面会讲到。

@Subscribe(threadMode = ThreadMode.POSTING)
public void XXX(MessageEvent messageEvent){
    ... 
}

线程模型

在EventBus的事件处理函数中需要指定线程模型,即指定事件处理函数运行所在的想线程。在上面我们已经接触到了EventBus的四种线程模型。那他们有什么区别呢? 在EventBus中的观察者通常有四种线程模型,分别是PostThread(默认)、MainThread、BackgroundThread与Async。

  • POSTING:如果使用事件处理函数指定了线程模型为PostThread,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。

  • MAIN:如果使用事件处理函数指定了线程模型为MainThread,那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。

  • BACKGROUND:如果使用事件处理函数指定了线程模型为BackgroundThread,那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。

  • ASYNC:如果使用事件处理函数指定了线程模型为Async,那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。

本文参考

  • https://segmentfault.com/a/1190000004279679
  • https://www.jianshu.com/p/c35f0c545fc9