EventBus初步使用

Quibbler 2021-9-12 945

EventBus初步使用


        

1、认识EventBus

        最早使用EventBus是在19年底,一位同学为了解耦代码引入的。深入学习一个开源库之前,得先了解它是干什么的,怎么用,现在记录一下。

        GitHub:greenrobot/EventBus

        官网:greenrobot.org/eventbus




1.1、介绍

       在使用EventBus之前,为了解耦各个组件之间的通信,常见的一种方法是使用广播,更高效一点就用本地广播EventBus的出现极大的简化了应用各组件之间的通信。主要优点官方都总结了:

  • 简化组件之间的通信
  • 分离事件发送者和接收者
  • 避免复杂且容易出错的依赖关系和生命周期问题
  • 非常快
  • 非常小(不到60kb),源代码1800余行


1.2、事件、订阅者、发布者

        EventBus作为事件发布总线,实现少不了观察者模式,有三个伙伴:

        事件:任意类型。发布者根据该事件类型,通知订阅该事件类型的订阅者。

        订阅者:订阅上面的事件,必须定义用@Subscribe注释的订阅方法。

        发布者:这里即EventBus实例本身,用EventBus.getDefault()获取默认发布者即可。


1.3、引入EventBus

        项目中引入EventBus,在build.gradle中添加如下依赖。依赖下载慢可以参考依赖库下载慢的解决办法

    implementation 'org.greenrobot:eventbus:3.2.0'



2、EventBus快速上手

        优秀的开源库,往往只需要最简单的操作。正如EventBus官方文档所描述,EventBus 使用起来就像 1-2-3 一样简单。


2.1、定义事件

        EventBus对事件类型没有任何特定要求,定义一个简单的POJO(Plain Old Java Object)即可。这里以一个简单的消息事件为例:

    public class MessageEvent {
    
        public final String message;
        
        public MessageEvent(String message) {
            this.message = message;
        }
        
    }

        根据实际业务,定义更复杂的事件类。


2.2、订阅事件

        定义订阅者方法处理事件(对于 EventBus 3,可以自由选择方法名称。没有像 EventBus 2 那样有命名约定)

    public void onEvent(MessageEvent messageEvent) {
        textView.setText(messageEvent.message);
    }

        并用@Subscribe 注释定义订阅者方法,Subscribe 注解有三个参数:线程模式、是否粘性事件、事件优先级。这里先不深究该注解的原理,关于Subscribe 注解详见EventBus源码分析(三):Subscribe注解详解一文。

    @Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true, priority = 100)
    public void onEvent(MessageEvent messageEvent) {
        textView.setText(messageEvent.message);
    }

        注册订阅者。通过EventBusgetDefault()方法获取默认实现单例,注册定义订阅方法的订阅者。

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

        注册过的对象一定要执行反注册。在Android开发中onStart()onStop()是一对不错的注册和反注册搭档。

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


2.3、发送事件

        订阅者已经订阅了事件,就等接收事件。接下来就该发送事件给订阅者,非常的简洁,就一行代码发送事件:

    EventBus.getDefault().post(new MessageEvent("Hello EventBus"));
    
    //或者发送粘性事件
    EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));

        可以从代码的任何地方发布事件,所有当前注册的与事件类型匹配的订阅者都会收到事件通知。极大的解耦了组件代码,不再需要用各种事件回调。



        到这里EventBus算是已经 "了解" 了。会不会有一些疑问:事件发布后所有的订阅者都能收到吗?如何向特定的订阅者发布事件?



参考资料:

        EventBus Documentation

        How to get started with EventBus in 3 steps

        “本地广播”LocalBroadcastManager源码解析

        BroadcastReceiver:广播的使用


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com