初识EventBus

What

发布/订阅事件总线,

EventBus is an open-source library for Android and Java using the publisher/subscriber pattern for loose coupling. EventBus enables central communication to decoupled classes with just a few lines of code – simplifying the code, removing dependencies, and speeding up app development.

How

三要素

  • Event: 事件, 任何类型
  • Subscriber: 订阅者, 消息发布后, 接收消息
  • Publisher: 发布者, 发布消息

开始使用

定义事件

public class MyEvent {
}

创建订阅者, 在接收事件的方法上贴上注解 @Subscribe, 参数为四种线程模型, 稍后讲到, 方法名称随意, 一般为 onEvent, 参数为订阅的事件.

public class MyEventSubscribe {
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEvent(MyEvent event){
        // TODO 
    }
}

订阅者订阅 Event, register 的参数为一个任意类型对象, 这个对象要存在一个方法被 @Subscribe 注解修饰

EventBus.getDefault().register(Obj);

取消订阅

EventBus.getDefault().unregister(Obj);

发布事件, post 参数为你定义的事件

EventBus.getDefault().post(Obj);

粘性事件

大概就是先发布, 后订阅也能接收到消息

EventBus 不同于 Handler

安卓中要注意的一点是, EventBus 的事件执行, 是没接受到一个事件, 如果线程指定为 ThreadMode.ASYNC, 则会新建线程, 而不是复用一个线程, 这一点区分于 Handler, 使用 Handler 是只要一个线程, 存在一个消息队列, 虚幻执行消息

ThreadMode(线程模型)

共四种

  • POSTING(默认)

该事件在哪个线程发布出来的, 事件处理函数就会在这个线程中运行. 在线程模型为 POSTING 的事件处理函数中尽量避免执行耗时操作, 因为它会阻塞事件的传递, 甚至有可能会引起 ANR.

  • MAIN:

事件的处理会在UI线程中执行. 事件处理时间不能太长, 长了会 ANR 的.

  • BACKGROUND:

如果事件是在 UI 线程中发布出来的, 那么该事件处理函数就会在新的线程中运行, 如果事件本来就是子线程中发布出来的, 那么该事件处理函数直接在发布事件的线程中执行. 在此事件处理函数中禁止进行 UI 更新操作.

  • ASYNC:

无论事件在哪个线程发布, 该事件处理函数都会在新建的子线程中执行, 同样, 此事件处理函数中禁止进行UI更新操作.

你可能感兴趣的:(初识EventBus)