美文网首页
源码分析--AndroidEventBus(1--registe

源码分析--AndroidEventBus(1--registe

作者: waitingal | 来源:发表于2016-09-06 11:23 被阅读0次

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

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

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 又是什么东东呢?接着查看这两个类的代码。

3

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

4

Subscription主要包含:

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

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

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

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

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

再查看TargetMethod的代码:

5

TargetMethod中包含:

method:事件执行方法

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

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

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

6

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

mMethodHunter.findSubcribeMethods(subscriber)

findSubcribeMethods方法代码:

7 8

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

相关文章

网友评论

      本文标题:源码分析--AndroidEventBus(1--registe

      本文链接:https://www.haomeiwen.com/subject/gnrssttx.html