源码分析--AndroidEventBus(1--register)

Android事件库中使用者最多的应该是EventBus 和 Otto了,而选择AndroidEventBus 
的原因就是使用起来简单,顺手。具体的用法可看该库的作者的Github.

先看看AndroidEventBus库的项目源码结构,共14个类,简洁而强大。


源码分析--AndroidEventBus(1--register)_第1张图片
1

一般事件订阅注册流程

      接收事件之前,我们都需要调用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的实例化代码。


2

可以看到 这个mSubcriberMap 是一个以 EventType为键,Subscription类型的list集合为值。那EventType 和 Subscription 又是什么东东呢?接着查看这两个类的代码。


源码分析--AndroidEventBus(1--register)_第2张图片
3

从EventType类的作者注释和这个类的成员变量可以看出 EventType 主要是包含事件发生后所执行的方法所对应的tag和方法的参数类型。



源码分析--AndroidEventBus(1--register)_第3张图片
4

Subscription主要包含:

subscriber:订阅者对象(即调用register(Object)时,传入的Object,这里我们可以理解为activity或者fragment )

targetMethod:执行方法(即事件发生后需要调用的方法)

threadMode:执行方法所属的线程类型

eventType:就是刚才上面查看的EventType对象(保存执行方法对应的tag和参数类型)

Subscription的构造函数中,需要传入subscriber(订阅者对象)和 TargetMethod。

再查看TargetMethod的代码:


源码分析--AndroidEventBus(1--register)_第4张图片
5

TargetMethod中包含:

method:事件执行方法

eventType:就是刚才上面查看的EventType对象(保存执行方法对应的tag和参数类型)

threadMode:执行方法所属的线程类型

Subscription,TargetMethod和EventType 有什么关系呢?这里我脑补一张图:


源码分析--AndroidEventBus(1--register)_第5张图片
6

介绍完以上的类后,回调register方法,调用了

mMethodHunter.findSubcribeMethods(subscriber)

findSubcribeMethods方法代码:


源码分析--AndroidEventBus(1--register)_第6张图片
7


源码分析--AndroidEventBus(1--register)_第7张图片
8

findSubcribeMethods方法主要就是获取订阅者以及其父类里所有带有Subscriber注解的方法,并获取这些方法的参数类型类,以及注解的tag和线程类型,并保存到EventBus的mSubcriberMap中,这样register的流程就走完了

你可能感兴趣的:(源码分析--AndroidEventBus(1--register))