参考文献
概述
- EventBus是一个Android开源库,其使用发布/订阅模式,以提供代码间的松耦合。
- EventBus使用中央通信方式,仅仅使用几行简单的代码,就可以达到解耦代码的目的。从而,简化代码,移除依赖,加快APP的开发速度。
- EventBus是一个消息总线,针对Android优化的发布/订阅事件总线.以观察者模式实现,用于简化应用程序内各组件间、组件与后台线程间的通信,可以轻易切换线程、开辟线程。
- EventBus简单来说:主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.
- 比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
EventBus优点
- 开销小,代码更优雅
- 简化组件之间的通信
- 解耦事件的发送者和接受者
- 耦合:是指两个或两个以上的体系或两种运动形式间通 过相互作用而彼此影响以至联合起来的现象。
- 解耦:就是用数学方法将两种运动分离开来处理问题,常用解耦方法就是忽略或简化对所研究问题影响较小的一种运动,只分析主要的运动。
- 很好的应用于Activity之间,Fragment之间,后台线程之间的通信,避免使用intent或者handler所带来的复杂度
- 可以避免复杂的,易于出错的依赖和生命周期问题
- 速度快,尤其是在做了优化之后
- 轻量 (大概 50k 的jar包)
- 有诸多高级特性,例如多种类型的线程模式,可以指定订阅者(subscriber)的优先级
EventBus特性
- 简单易用的基于注解的API:简单地把@Subscribe注解放在你的订阅方法前面即可。通过编译期的订阅者索引,app不需要在运行期做注解反射。
- 支持事件投递到Android主线程:当订阅者需要和UI做交互的时候,EventBus能发送事件到主线程中去,而不管该事件是从哪个线程中发出来的。
- 支持事件投递到后台线程:当订阅者需要做耗时任务时,EventBus能发送事件到后台线程中去,避免阻塞主线程。
- 支持事件&订阅者继承关系:在EventBus中,面向对象也被应用到事件和订阅者类中。例如,事件类A是事件类B的父类,这时,发送B类型的事件,该事件也会发送给对于事件类A感兴趣的订阅者。对于订阅者类,也存在相似的继承关系。
- 零设定即可使用:不需要任何设定,在你代码的任何地方,使用一个现成的默认的EventBus实例对象,你就可以开始工作了。
- 可配置:使用建造者模式,你可以调整EventBus的行为,使之满足你的需求。
相似产品比较
- EventBus
开发者:greenrobot
特点:用户最多,简洁,方便,小巧,文档简洁明了 - Guava
开发者:google
特点: 一个庞大的工具类库,EventBus只是一个小功能 - otto
开发者:square
特点:fork guava ,用的人不少 - AndroidEventBus
开发者:何红辉
特点:模仿EventBus开发的
使用前的配置:
app中的modul目录下builde.gradle文件dependencies 中添加依赖后进行同步:
implementation 'org.greenrobot:eventbus:3.2.0'
//implementation 'org.greenrobot:eventbus:3.1.1'
使用EventBus3.0步骤
- 定义事件
定义一个实体类,定义必要的属性 - 准备订阅者
定义一个方法,接收事件的实体类 - 注册注销
在Activity创建的时候注册Activity销毁的时候注销 - 发送事件
在且当的时候发送事件,例如子线程中获取 到数据需要到主线程更新UI
EventBus主要角色:
- Event 传递的事件对象
- Subscriber 事件的订阅者
- Publisher 事件的发布者
- ThreadMode 定义函数在何种线程中执行
EventBus优缺点:
目前发现唯一的缺点就是类似之前策略模式一样的诟病,每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本