Regist过程
入口就是EventBus类中的register流程了
本章会分析下注册的大致过程,以及在平常使用过程中遇到的crash的原因;
EventBus注册的流程其实很简单,就是通过反射机制找到订阅者对象的全部方法,在利用注解来为订阅者方法设置订阅的参数和订阅线程,完成订阅者对象和订阅方法的订阅过程;
该方法最关键的就是 注释1 和注释 2了;
注释1,涉及到SubScriberMethodFinder这个类;
我们在EventBus初始化的过程中就已经对SubScriberMethodFinder进行了初始化;
该类主要提供了订阅者对象和订阅者方法的存储以及获取功能,就是一个订阅者对象和它的订阅者对象的1个管理类;
注释1就是通过该类来查询订阅者对象返回它的订阅者方法集合;
如何查询呢?往下看
ignoreGeneratedIndex这个字段 是我们在初始化EventBus的时候就可以设置的,是能提高EventBus的一种手段,默认ture;
无论是通过反射机制获取还是通过index索引方式获取,返回的都是订阅方法的集合;先不细究两种方式的区别,下文会特别写一篇来说明这块;
在获取订阅方法的过程中会涉及到SubscribeMethod这个类,他只是1个保存订阅方法的信息包装类
回到注册的主流程
在注解1 获取到订阅对象的全部订阅方法后,在注解2 循环遍历,调用subscribe完成订阅者对象和订阅方法的订阅关系;
接着往下看subscribe是如何完成订阅对象和订阅方法的订阅关系的
Subcription只是1个保存订阅者对象和订阅方法信息的信息类;
subscriptionsByEventType 在EventBus初始化的时候初始化了。仅当在subscibe的时候put值;
因此在此处第一次注册的时候subscriptions必为null;
相同对象第二次订阅的时候就会报 already registered to event 异常,也就是我们平常使用过程中1个类重复订阅时候报的错;
注解1 可能有点绕,我举个栗子,
typesBySubscriber的key就是TestEventParent,value就是List<Class>,里面有Event02.Class和Event01.Class
正常的注册过程是到这就结束了;
粘性事件的注册
在注册订阅者对象的时候,如果检测到粘性事件的对象池中含有该订阅者对象,则触发postToSubscription通过反射来触发粘性事件,具体的发射过程在EventBus的发射流程再来分析