EventBus-v3.2.0源码流程分析
2020-10-28 11:24:40 0 举报
登录查看完整内容
EventBus源码流程分析
作者其他创作
大纲/内容
7:invokeSubscriber
3:lookupAllEventTypes
当默认注册时:EventBus.getDefault().register(Object object);
6:postToSubscription
返回是否添加过
2: postSingleEvent
三、粘性事件
9:add
10:moveToSuperclass
6:getSubscriberInfo
5:postToSubscription
3:findUsingInfo
EventBus
7:findUsingReflectionInSingleClass
4:postSingleEventForEventType
6:invokeSubscriber
12:recycle
二、事件发送
一、注册流程
1:post
2:post
13:put
1:postSticky
解注册:1、调用EventBus对象的unregister()方法, 首先通过typesBySubscriber集合获取对应的缓存注册类注解方法参数类型列表通过遍历删除,然后调用 unsubscribeByEventType()方法进一步删除缓存数据2、通过subscriptionsByEventType集合获取Subscription对象列表, 通过遍历删除对应的Subscription对象
2:findSubscriberMethods
粘性事件发送:1、调用EventBus对象的postSticky()方法发送粘性事件, 此时通过stickyEvents变量Map集合缓存发送粘性事件的参数对象,然后通过post()方法发送事件2、调用post()方法发送事件, 参考第二部分事件发送注册时发送粘性事件:3、粘性事件是伴随类的注册而发送事件(当存在粘性对象数据时),调用register()方法进行类注册并且返回类的注解信息,然后调用subscribe()方法缓存对应的注册类以及注册类注解信息; 最后会判断注解方法是否为粘性事件, 方为粘性事件时会通过stickyEvents集合获取到粘性事件参数对象, 调用checkPostStickyEventToSubscription()方法检验参数并且发送事件4、判断注解方法是否为粘性事件, 方为粘性事件时会通过stickyEvents集合获取到粘性事件参数对象, 调用checkPostStickyEventToSubscription()方法检验参数并且发送事件5、判断粘性参数对象是否存在, 存在则调用postToSubscription()进一步处理线程问题6、根据注解方法设置的线程信息, 判断是什么类型调用具体的处理方法, 此处采用默认的线程信息调用invokeSubscriber()方法进行一步处理7、获取到注册类的注解方法, 通过反射将发送参数对象传入调用到具体注册类的注解方法; 到此一个粘性事件发送完成
返回SubscriberMethod对象列表
FindState
1:unregister
14:subscribe
EventBus.getDefault().unregister(Object object)
2:unsubscribeByEventType
5:initForSubscriber
普通事件发送:EventBus.getDefault().post(Object obj);
1:register
4:subscribe
4:prepareFindState
SubscriberMethodFinder
11:getMethodsAndRelease
四、解注册
5:checkPostStickyEventToSubscription
8:checkAdd
粘性事件发送:EventBus.getDefault().postSticky(Object object);
3:register
普通事件发送流程:1、发送事件是与发送事件的参数类型密切相关的, 是通过发送参数对象来进行定位;当注册完事件类时, 通过发送参数对象将注册类的注解信息缓存在subscriptionsByEventType变量的Map集合中, 最终通过发送参数对象在subscriptionsByEventType集合中找到对应参数对象注解方法, 通过反射调用注解方法发送事件;调用post()方法将发送参数对象传入, 通过ThreadLocal对象获取当前线程的缓存参数对象PostingThreadState, ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据, 将发送参数对象缓存在对象PostingThreadState的一个列表中,除此之后PostingThreadState对还记录是否为主线程、是否已经发送;最终通过遍历调用postSingleEvent()方法发送事件2、最要是封装发送参数对象, 获取发送参数对象的Class列表(包括父类实现), 通过遍历处理列表的每一个参数对象, 调用postSingleEventForEventType()方法继续执行事件发送3、调用lookupAllEventTypes()方法主要是处理参数对象类型, 将参数类型以及参数父类型缓存带列表中并且返回4、首先从subscriptionsByEventType集合中根据参数对象获取到Subscription对象列表(注册类与注册类注解信息的封装, 列表具有优先级排序);然后通过遍历Subscription对象列表获取Subscription对象; 最后调用postToSubscription()进一步处理线程问题5、根据注解方法设置的线程信息, 判断是什么类型调用具体的处理方法, 此处采用默认的线程信息调用invokeSubscriber()方法进行一步处理6、获取到注册类的注解方法, 通过反射将发送参数对象传入调用到具体注册类的注解方法; 到此一个事件发送完成总结:发送部分没有什么花里胡哨的封装, 直接一步到位; 因为发送会涉及多线程并发问题, 此处采用ThreadLocal对象管理线程数据, 防止不同线程操作会造成参数改变问题
0 条评论
回复 删除
下一页