资料整理:
android常见的事件总线库
EventBus in GitHub
最新版本3.0.0
AndroidEventBus
最新版本1.0.4
otto
最新版本 1.3.8
相关博客
事件总线源码分析
这篇文章从订阅/发布模型入手,介绍了EventBus和Otto两个事件总线框架,并从源码角度解析了EventBus(源码非最新)
Android事件总线 ( AndroidEventBus ) 开源库发布
任玉刚的博客,从android跨组间通信入手,介绍了自己的开源库AndroidEventBus,分析了greenrobot的EventBus的不足,并提出自己的改进方式。
otto 源码分析
Square公司的otto同样基于发布-订阅模式, 通过注解的形式将具体的方法作为订阅者和发布者。
上面三篇博客分别主要介绍了目前android中三个最主要的事件总线库,这里我借用一张表格来简要展示下各种的优缺点(表格转自任玉刚,也就是AndroidEventBus的作者):
名称 | 订阅函数是否可执行在其他线程 | 特点 |
---|---|---|
greenrobot的EventBus | 是 | 使用name pattern模式,效率高,但使用不方便。 |
square的otto | 否 | 使用注解,使用方便,但效率比不了EventBus。 |
AndroidEventBus | 否 | 使用注解,使用方便,但效率比不上EventBus。订阅函数支持tag(类似广播接收器的Action)使得事件的投递更加准确,能适应更多使用场景。 |
事件总线存在的优点想必大家都很清楚了,android自带的广播机制对于组件间的通信而言,使用非常繁琐,通信组件彼此之间的订阅和发布的耦合也比较严重,更重要的是对于事件的定义,广播机制局限于序列化的类(通过Intent传递),不够灵活。
这里谈到的事件总线库,其实本质都是基于“事件总线框架”,这套框架采用的是“发布/订阅”模型。事件类 事件总线 发布者 订阅者 这四个核心角色是这一框架的基础,说白了,事件总线通过不同的调度策略,在已维护的“事件-发布者-订阅者”的集合中,将事件从发布者传递到订阅者当中。使用简单是因为,发布者和订阅者的注册,都由事件总线统筹管理。订阅函数由事件总线通过注解或者反射的方式自动维护和调用。 otto和AndroidEventBus采用的是注解,EventBus则是规定方法名基础上采用反射。
从调度策略角度,EventBus定义了四种ThreadMode,通过订阅方法的名称来实现。otto的event bus模式事件调度的重要规则是事件调度仅在发送线程域中进行,通过线程控制策略ThreadEnforcer类实现不同的线程控制。同样的,AndroidEventBus同样定义了三种ThreadMode,与 greenrobot的EventBus定义的区别也仅是,前者采用注解,后者采用方法名标记。