美文网首页Android
AndroidのEventBus

AndroidのEventBus

作者: 耑意儿 | 来源:发表于2021-03-03 18:05 被阅读0次
    目录:
    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

        本文链接:https://www.haomeiwen.com/subject/jbxcqltx.html