文章目录
EventBus 注册订阅者流程梳理
EventBus 注册订阅者流程梳理
EventBus 注册订阅者流程梳理 :
① 在 客户端 调用 EventBus.getDefault().register() 方法 , 启动订阅者注册行为 ; 在该方法中先查找 订阅方法 集合 , 然后遍历并注册订阅方法 ; EventBus 注册订阅者
② 查找 订阅方法 集合 , 在 findSubscriberMethods 方法中进行查找 , 这里还涉及到缓存机制 , 如果是第一次查找 , 将查找到的订阅方法都封装到 METHOD_CACHE 集合中 , 之后便从该集合中获取 订阅方法 ;
查找订阅方法 findSubscriberMethods 方法
③ 在 findUsingReflectionInSingleClass 方法中 , 通过反射获取订阅者类中的所有方法 , 遍历 订阅者 类中的所有方法 , 过滤掉不符合条件的方法 , 将符合条件的方法封装到 findState.subscriberMethods 集合中 , 该集合的原型是 List<SubscriberMethod> subscriberMethods ; 查找订阅方法 findUsingReflectionInSingleClass
④ 遍历上述得到的 List<SubscriberMethod> subscriberMethods 订阅方法集合
⑤ 将 订阅方法 所在的 订阅者对象 , 和 订阅方法 , 封装到 Subscription 类中 , 每个 Subscription 类中只能封装 1 11 个订阅者对象和 1 11 个订阅方法 ; 注册订阅方法的具体过程
将上述封装的 放到 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成员变量中 , Key 是订阅方法接收的事件类型 , Value 是 Subscription 集合 , 每个 Subscription 中封装了一个订阅者对象和一个订阅方法 ;
该 subscriptionsByEventType 成员变量的作用是可以在发送消息时 , 可以快速找到接收消息的订阅方法 ;
⑥ 将 订阅者对象 和 订阅方法参数类型集合 放到 Map<Object, List<Class<?>>> typesBySubscriber 成员变量中 , 其中 Key 是订阅者对象 , Value 是订阅方法参数类型集合 , 每个元素都是一个订阅方法的参数 , 这些订阅方法都在订阅者对象中 ; 注册订阅方法的具体过程
该 typesBySubscriber 成员变量 的作用是在取消订阅时 , 可以根据订阅者对象 , 找到所有的订阅方法 ;