EventBus初步使用

QuibblerQuibbler 2021-09-12 约 6 分钟 1890 次阅读

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);
    }

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

@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:广播的使用


相关推荐

精选
Airbnb开源项目
开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k