EventBus3.0源码解析

EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。
EventBus使用简单,并将事件发布和订阅充分解耦,从而使代码更简洁。
本文主要从以下几个模块来介绍
1、EventBus使用
2、EventBus注册源码解析
3、EventBus事件分发解析
4、EventBus取消注册解析

threadmode :方法执行的线程
sticky:是否接受粘性事件
priority:优先级
String str 方法接受类型

EventBus.getDefault 是单例模式   项目中存在一个 适合管理订阅者、订阅方法

注册过程:

首先获取订阅者的class对象,通过SubctriberMethodFinder获得订阅者订阅的事件,
返回一个SubscriberMethod的集合,SubscriberMethod里面封装着用来响应不同线程的ThreadMode,以及订阅的事件类型eventType,以及订阅的优先级priority,是否粘性事件sticky的boolean值   会得到 订阅者的类对象
subscriberMethodFinder.findSubscriberMethods获取所有订阅者的信息

SubscripeMethodFinder类用来查找和缓存订阅者响应函数信息的类,EventBus
提供了一个EventBusAnnotationProcessor
注解处理器来在编译期通过读取@Subscribe()
注解并解析,处理其中所包含的信息,然后生成java
类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快.我们可以参考EventBus
项目里的EventBusPerformance这个例子,编译后我们可以在build
文件夹里找到这个类,MyEventBusIndex 类,当然类名是可以自定义的.我们大致看一下生成的MyEventBusIndex
类是什么样的:

生成了一个静态HashMap对象 ,包含着订阅类的class对象,订阅方法的订阅线程,Sticky粘性事件的值 ,priority优先级,这其中保存了register的信息。

我们也可以通过EvnetBusBuilder配置将编译生成的MyEventBusindex这个类进去,就直接可以查找订阅类的信息,也可以直接通过注解方式获取FindeSubscriperMethods获取订阅类的信息。
FinderSubScripeMethods 里面的先判断是否有缓存

然后是 判断是使用反射形式获取订阅类的信息 还是 注解方式订阅信息

注解方式订阅信息 就如上面所讲直接将MyEventBusIndex类的信息转换成成SubscripeMethod的集合,获取订阅类相关函数的信息,反射的话 会通过FindState用来做订阅方法的校检与保存 并通过一个静态数组用来保存 复用等,最后通过findUsingReflectionInSingleClass()来获取相关订阅方法信息
findUsingReflectionInSingleClass 类通过反射得到方法数组 遍历数组、得到注解、实例化SubscripeMethod 并添加、我们订阅类的所有SubscriberMethod都已经被保存了,最后再通过getMethodsAndRelease()返回List<SubscriberMethod>至此,所有关于如何获得订阅类的订阅方法信息
4.2.3 subscribe()方法的实现

好的,这里我们回到4.2.1的subscribe(subscriber, subscriberMethod);中去,通过这个方法,我们就完成了注册,下面看一下subscribe()的实现: