AndroidのEventBus

目录:
1.1 EventBus的实现原理
1.2 EventBus的基本使用
1.3 EventBus的ThreadMode
1.4 当前常用的事件总线对比

EventBus 原理解析
用LiveEventBus替代RxBus、EventBus
LiveEventBus的使用
【侵权删】

1.1 EventBus的实现原理

EventBus是一种基于观察者模式的发布/订阅事件总线框架
EventBus的注册,通过反射的方式获取到观察者的事件、方法、所在线程。
以事件类型为key键将这些信息存入到Map中。
事件发布者将事件通过post方法发送到EventBus中,EventBus将指定的事件分发给订阅者。

image.png

EventBus使用Subscribe注解可以指定threadMode,sticky,priority
EventBus.getDefault()是一个单例方法
可以通过配置EventBusBuilder来更改EventBus的属性

1.2 使用:

注册: EventBus.getDefault().register(this);
注销:EventBus.getDefault().unregister(this);
定义事件:普通类,变量+载入变量的构造函数
发送事件:构造事件并发送:EventBus.getDefault().post();
接收事件:添加注解Subscribe,指定线程,参数是事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEventModel aEvent) {
}

其他方法:
判断是否已经注册:EventBus.getDefault().isRegistered(this)

完整案例:

// 注册:
private void initEventBus() {
    if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }
    }
    
// 注销:
@Override
protected void onStop() {
    super.onStop();
    if (isFinishing()&&EventBus.getDefault()
        .isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }

// 发送
AEvent aEvent = new AEvent("1", msgId);
EventBus.getDefault().post(aEvent);   
    
// 接收
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEvent event) {
    ...
}

1.3 EventBus的ThreadMode

线程模式 决定了在当前线程线程发送事件后是在当前线程接收处理事件,还是回到主线程处理事件,亦或是新开一个线程处理事件。
EventBus提供了五种线程模式:

  • ThreadMode.POSTINGposting
    默认的线程模式,在哪个线程发送事件就在对应线程处理事件,避免了线程切换,效率高。
  • ThreadMode.MAINmain
    如在主线程(UI线程)发送事件,则直接在主线程处理事件;如果在子线程发送事件,则先将事件列入队列,然后通过 Handler 切换到主线程,依次处理事件。
  • ThreadMode.MAIN_ORDEREDmain_ordered
    无论在哪个线程发送事件,都先将事件列入队列,然后通过 Handler 切换到主线程,依次处理事件。
  • ThreadMode.BACKGROUNDbackground
    如果在主线程发送事件,则先将事件列入队列,然后通过线程池依次处理事件;如果在子线程发送事件,则直接在发送事件的线程处理事件。
  • ThreadMode.ASYNCasync
    无论在哪个线程发送事件,都将事件列入队列,然后通过线程池处理。

1.4 当前常用的事件总线对比

image.png

为什么要用LiveEventBus

  • 能感知生命周期
    1 消息随时订阅,自动取消订阅
    2 告别内存泄漏
    3 告别生命周期造成的崩溃

  • 支持跨进程、跨APP消息发送
    1 进程内通信
    2 APP内跨进程通信
    3 APP间通信

  • 还有其他更多特性
    1 免配置直接使用,方便快捷
    2 支持粘性消息Sticky
    3 支持AndroidX
    4 支持延迟发送
    5 观察者支持多种接收模式(全生命周期/激活状态可接受消息)

你可能感兴趣的:(AndroidのEventBus)