前言: 作为EventBus源码解析的第一篇文章,我们首先来解读EventBus官方对于EventBus库的介绍。
EventBus: Events for Android
EventBus是一个为Java和Android而生的开源库,它使用了发布者/订阅者的设计模式来实现APP的松耦合。EventBus作为通信的中心,用户只需书写几行代码,就可以很方便地解除类与类之间的耦合。下图是官方提供的通信流程图。
imageEventBus译文是事件总线,它作为事件通信的核心,主要实现了以下两个功能:
- 接收并缓存发布者发布的事件;
- 通知订阅者执行订阅方法;
前文说过,EventBus的设计是基于发布者/订阅者模式的,也就是所谓的观察者模式。我们知道,传统的观察者模式,会在发布者中持有一系列的订阅者引用,当有事件发生时,由发布者遍历通知订阅者去执行相应的订阅方法,它有以下几个弊端:
- 事件的管理和分发调度都由发布者维护,任务较重;
- 发布者持有观察者引用,本身就存在耦合;
EventBus对这种模式做了扩展,将事件的管理和分发调度从发布者中抽离出来,形成了事件总线EventBus,也自然解除了发布者与订阅者之间的耦合,这种设计值得借鉴。
使用EventBus的好处
- 简化组件之间的通信
- 事件发布者与订阅者充分解耦
- 可以很好地与UI组件(例如Activity、Fragment)和后台线程配合使用
- 避免错综复杂且易错的依赖与生命周期问题
- 快速,专门为在Android上使用而优化过
- 体积小(jar包小于50k)
- 经过大量App的使用考验
- 拥有诸如线程投递、订阅优先级等高级特性
EventBus高级特性
- 基于注解:只需在订阅方法上添加注解标记@Subscribe。由于在构建时使用了注解索引技术,因此在App运行时,EventBus无需通过反射获取注解信息,而反射对运行时性能是有消耗的
- Android主线程分发:当需要与UI交互时,EventBus可以将事件分发到主线程,而无需考虑事件来源-即该事件是从哪个线程发布的
- 后台线程分发:如果订阅者需要执行耗时长的任务,EventBus也可以使用后台线程,从而避免了主线程阻塞
- 事件、订阅者可继承性:在EventBus中,对象继承也适用于事件和订阅者类。假设事件A是事件B的超类,当发布类型B的事件时,该事件同时也会被发布到对事件A感兴趣的订阅者处。
- 零配置:用户可以立即开始使用,而无需做任何的配置。在代码的任意地方都可以使用默认的EventBus实例
- 可配置:可以使用建造者模式来调整EventBus的特性,以适应你的个人需求
网友评论