Android EventBus 基础用法

01.EventBus简介

  • 1.1 EventBus的三要素
    • Event:事件
      可以是任意类型的对象。
    • Subscriber:事件订阅者
      在EventBus3.0之前,消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他们分别代表四种线程模型。
      在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型下面会讲到。
    • Publisher:事件发布者
      可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就好了,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
  • 1.2 EventBus的四种ThreadMode(线程模型)
    • POSTING(默认):
      如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
    • MAIN:
      事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
    • BACKGROUND:
      如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
    • ASYNC:
      无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
  • 1.3 EventBus怎么调用**
    代码如下: EventBus.getDefault().post(param);
    • 调用原理简单理解为:
    • 一句话,你也可以叫发布,只要把这个param发布出去,EventBus会在它内部存储的方法中,进行扫描,找到参数匹配的,就使用反射进行调用。
    • 撇开专业术语:其实EventBus就是在内部存储了一堆onEvent开头的方法,然后post的时候,根据post传入的参数,去找到匹配的方法,反射调用之。
    • 它内部使用了Map进行存储,键就是参数的Class类型。知道是这个类型,那么你觉得根据post传入的参数进行查找还是个事么?

02.EventBus使用

2.1 最简单的使用

  • 自定义一个事件类

    1
    2
    public class MessageEvent {
    }
  • 在需要订阅事件的地方注册事件

    1
    EventBus.getDefault().register(this);
  • 发送事件

    1
    EventBus.getDefault().post(messageEvent);
  • 处理事件

    • 3.0之后, 消息处理的方法可以随便取名。问题:(threadMode=ThreadMode.MAIN)是做什么用的??
      需要添加一个注解@Subscribe,并且要指定线程模型。如果没有添加,那就是默认为POSTING
    1
    2
    3
    4
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Hhhh(MessageEvent messageEvent) {
    ...
    }
  • 取消事件订阅

    1
    EventBus.getDefault().unregister(this);