野火🔥

生命如野火,骄傲而顽强

otto源码解析及探索修改

本人之前在微信做iOS开发时,曾使用微信自己开发的 ExtensionCenter 框架来做事件的订阅和发布,使得代码各个层级完美解耦,当时就希望能将该思想应用于 Android开发领域。

在进行现有项目调研的过程中,发现了Android上的开源工程EventBus 和 otto,这两个工程和我想实现的ExtensionCenter思想非常类似,在具体应用上使用了java特有的特性,但也有一些不足。本文将首先针对otto的架构设计和源码进行分析,之后介绍个人融合 微信iOS版中ExtensionCenter思想的修改版otto的框架。

otto源码解析

otto是最早完整阅读过源码的开源工程,并且在个人的项目中早已广泛应用。

1. 功能介绍

1.1 otto

otto 是在 Android 系统上一个类似EventBus 的事件发布/订阅框架,相对于EventBus使用更简单,更精简。它通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。

传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 otto 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。

1.2 概念

事件(Event):又可称为消息,本文中统一用事件表示。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。

订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,otto 会执行订阅者在之前通过 register 接口订阅的对应函数,这个函数叫事件响应函数。识别响应该事件的方式为标记@Subcriber的方法入参是否与该事件类型相同,或者未该事件类型的父类。

发布者(Publisher):发布某事件的对象,通过 post 接口发布事件。

生产者(Producer):可以认为是发布者(Publisher)的一种特殊类型,只调用一次,在调用 register 接口订阅时调用,相对于使用post发布,这种方式更为清晰,可以用于某些数据的初始化。

2. 项目结构解析

2.1 几个工具类型的class

  • @Annotation --- otto使用注解的方式来识别 订阅者(Subscriber) 和 生产者(Producer),描述注解类为@Subscriber 和 @Producer。@Subscriber要用来标识public的返回值为void同时有且只有一个入参的method,@Producer用来标识一个public且返回值非void的且没有入参的method。

  • Base Entity --- otto封装了3个实体,EventProducer、EventHandler、ReadEvent。
    EventProducer是对生产者(Producer)发布事件的封装,成员变量