EventBus源码解析-注册

Regist过程


EventBus源码解析-注册_第1张图片

入口就是EventBus类中的register流程了

本章会分析下注册的大致过程,以及在平常使用过程中遇到的crash的原因;

EventBus注册的流程其实很简单,就是通过反射机制找到订阅者对象的全部方法,在利用注解来为订阅者方法设置订阅的参数和订阅线程,完成订阅者对象和订阅方法的订阅过程;

该方法最关键的就是  注释1 和注释 2了;

注释1,涉及到SubScriberMethodFinder这个类;


EventBus源码解析-注册_第2张图片

我们在EventBus初始化的过程中就已经对SubScriberMethodFinder进行了初始化;

该类主要提供了订阅者对象和订阅者方法的存储以及获取功能,就是一个订阅者对象和它的订阅者对象的1个管理类;

注释1就是通过该类来查询订阅者对象返回它的订阅者方法集合;

如何查询呢?往下看


EventBus源码解析-注册_第3张图片

ignoreGeneratedIndex这个字段 是我们在初始化EventBus的时候就可以设置的,是能提高EventBus的一种手段,默认ture;

无论是通过反射机制获取还是通过index索引方式获取,返回的都是订阅方法的集合;先不细究两种方式的区别,下文会特别写一篇来说明这块;

在获取订阅方法的过程中会涉及到SubscribeMethod这个类,他只是1个保存订阅方法的信息包装类


EventBus源码解析-注册_第4张图片

回到注册的主流程

在注解1 获取到订阅对象的全部订阅方法后,在注解2 循环遍历,调用subscribe完成订阅者对象和订阅方法的订阅关系;


EventBus源码解析-注册_第5张图片

接着往下看subscribe是如何完成订阅对象和订阅方法的订阅关系的

Subcription只是1个保存订阅者对象和订阅方法信息的信息类;

subscriptionsByEventType 在EventBus初始化的时候初始化了。仅当在subscibe的时候put值;

因此在此处第一次注册的时候subscriptions必为null;

相同对象第二次订阅的时候就会报 already registered to event 异常,也就是我们平常使用过程中1个类重复订阅时候报的错;


EventBus源码解析-注册_第6张图片

注解1 可能有点绕,我举个栗子,


EventBus源码解析-注册_第7张图片

typesBySubscriber的key就是TestEventParent,value就是List,里面有Event02.Class和Event01.Class

正常的注册过程是到这就结束了;

粘性事件的注册


EventBus源码解析-注册_第8张图片

在注册订阅者对象的时候,如果检测到粘性事件的对象池中含有该订阅者对象,则触发postToSubscription通过反射来触发粘性事件,具体的发射过程在EventBus的发射流程再来分析


EventBus源码解析-注册_第9张图片

你可能感兴趣的:(EventBus源码解析-注册)