【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
EventBus 注册订阅者流程梳理
EventBus 注册订阅者流程梳理 :
① 在 客户端 调用 EventBus.getDefault().register()
方法 , 启动订阅者注册行为 ; 在该方法中先查找 订阅方法 集合 , 然后遍历并注册订阅方法 ; EventBus 注册订阅者
② 查找 订阅方法 集合 , 在 findSubscriberMethods
方法中进行查找 , 这里还涉及到缓存机制 , 如果是第一次查找 , 将查找到的订阅方法都封装到 METHOD_CACHE
集合中 , 之后便从该集合中获取 订阅方法 ;
查找订阅方法 findSubscriberMethods 方法
③ 在 findUsingReflectionInSingleClass
方法中 , 通过反射获取订阅者类中的所有方法 , 遍历 订阅者 类中的所有方法 , 过滤掉不符合条件的方法 , 将符合条件的方法封装到 findState.subscriberMethods
集合中 , 该集合的原型是 List<SubscriberMethod> subscriberMethods
; 查找订阅方法 findUsingReflectionInSingleClass
④ 遍历上述得到的 List<SubscriberMethod> subscriberMethods
订阅方法集合
⑤ 将 订阅方法 所在的 订阅者对象 , 和 订阅方法 , 封装到 Subscription
类中 , 每个 Subscription
类中只能封装 1 1 1 个订阅者对象和 1 1 1 个订阅方法 ; 注册订阅方法的具体过程
将上述封装的 放到 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType
成员变量中 , Key 是订阅方法接收的事件类型 , Value 是 Subscription 集合 , 每个 Subscription 中封装了一个订阅者对象和一个订阅方法 ;
该 subscriptionsByEventType
成员变量的作用是可以在发送消息时 , 可以快速找到接收消息的订阅方法 ;
⑥ 将 订阅者对象 和 订阅方法参数类型集合 放到 Map<Object, List<Class<?>>> typesBySubscriber
成员变量中 , 其中 Key 是订阅者对象 , Value 是订阅方法参数类型集合 , 每个元素都是一个订阅方法的参数 , 这些订阅方法都在订阅者对象中 ; 注册订阅方法的具体过程
该 typesBySubscriber
成员变量 的作用是在取消订阅时 , 可以根据订阅者对象 , 找到所有的订阅方法 ;
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/120447330
- 点赞
- 收藏
- 关注作者
评论(0)