Android事件库中使用者最多的应该是EventBus 和 Otto了,而选择AndroidEventBus
的原因就是使用起来简单,顺手。具体的用法可看该库的作者的Github.
先看看AndroidEventBus库的项目源码结构,共14个类,简洁而强大。
一般事件订阅注册流程
接收事件之前,我们都需要调用EventBus.getDefault().register(Object) 注册为订阅者。EventBus是整个事件库的入口,也是这个库的核心类,所有的操作都需用到。
既然事件发生之前都需调用register(Object),那么就从这个方法开始查看代码。
public voidregister(Object subscriber) {
if(subscriber ==null) {
return;
}
synchronized(this) {
mMethodHunter.findSubcribeMethods(subscriber);
}
}
这里除空判断外只执行 mMethodHunter.findSubcribeMethods(subscriber);
那么mMethodHunter 是什么鬼?findSubcribeMethods中又做了什么?
首先找出mMethodHunter在EventBus的实例化代码
SubsciberMethodHunter mMethodHunter=new SubsciberMethodHunter(mSubcriberMap);
可以看到实例化mMethodHunter的时候,传了一个mSubcriberMap,看名字我们知道这个是一个键对值的集合。 继续找出mSubcriberMap的实例化代码。
可以看到 这个mSubcriberMap 是一个以 EventType为键,Subscription类型的list集合为值。那EventType 和 Subscription 又是什么东东呢?接着查看这两个类的代码。
从EventType类的作者注释和这个类的成员变量可以看出 EventType 主要是包含事件发生后所执行的方法所对应的tag和方法的参数类型。
Subscription主要包含:
subscriber:订阅者对象(即调用register(Object)时,传入的Object,这里我们可以理解为activity或者fragment )
targetMethod:执行方法(即事件发生后需要调用的方法)
threadMode:执行方法所属的线程类型
eventType:就是刚才上面查看的EventType对象(保存执行方法对应的tag和参数类型)
Subscription的构造函数中,需要传入subscriber(订阅者对象)和 TargetMethod。
再查看TargetMethod的代码:
TargetMethod中包含:
method:事件执行方法
eventType:就是刚才上面查看的EventType对象(保存执行方法对应的tag和参数类型)
threadMode:执行方法所属的线程类型
Subscription,TargetMethod和EventType 有什么关系呢?这里我脑补一张图:
介绍完以上的类后,回调register方法,调用了
mMethodHunter.findSubcribeMethods(subscriber)
findSubcribeMethods方法代码:
findSubcribeMethods方法主要就是获取订阅者以及其父类里所有带有Subscriber注解的方法,并获取这些方法的参数类型类,以及注解的tag和线程类型,并保存到EventBus的mSubcriberMap中,这样register的流程就走完了