1. 注册EventBus: register(Object subscriber)
- 获取该subscriber的SubscribeMethod列表;
List<SubscriberMethod> subscriberMethods
- 执行
subscriberMethodFinder.findSubscriberMethods(subscriberClass)
获取List<SubscriberMethod>
; - 执行
findUsingReflectionInSingleClass()
反射获取subscriber中所有methods,Subscribe注解的Method会记录在SubscriberMethodFinder.FindState.subscriberMethods()
;
- 执行
- 遍历SubscribeMethod列表执行
subscribe(subscriber, subscriberMethod)
;- 更新
Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType
,该字段表示:某个Event对应哪些@Subscribe注解的方法; - 更新
Map<Object, List<Class<?>>> typesBySubscriber
,该字段表示:register过的类接收哪些Event;该字段的作用:1> 判断是否注册过; 2>注销时辅助subscriptionsByEventType删除对应event的Subscription;
- 更新
- 对于sticky的subscription,注册时检查stickyEvents中是否包含subscriberMethod.eventType的最近事件,如果有立即发出
postToSubscription()
; unregister(Object subscriber)
相对简单,从subscriptionsByEventType和typesBySubscriber中删除相应subscriber;- 重复
register()
会crash,重复unregister()
则不会;
2. 发送、接收Event:post(Object event)
-
post(Object event)
:ThreadLocal<PostingThreadState>
类型变量currentPostingThreadState的eventQueue列表会接收event;Event依次从eventQueue取出,执行postSingleEvent()
; -
postSingleEvent(Object event, PostingTHreadState postingState)
中获取Event Class列表:lookupAllEventTypes(eventClass)
, 该列表包含eventClass、递归父类class直到Object;遍历列表,执行postSingleEventForEventType()
方法; -
postSingleEventForEventType(Event, PostingThreadState, eventClass)
根据eventClass,从subscriptionsByEventType获取Subscriptions列表, 遍历执行postToSubscription()
; -
postToSubscription(Subscription subscription, Object event, boolean isMainThread)
根据subscription.subscriberMethod.threadMode 和 isMainThread 判断,决定event发送线程; -
最终都是反射构造出注册的方法(@Subscribe注解的方法),将event传入;
invokeSubscriber(Subscription subscription, Object event)
subscription.subscriberMethod.method.invoke(subscription.subscriber, event);
3. EventBus中的ThreadMode
Mode | 说明 |
---|---|
POSTING | 默认Mode; 在发送Event的线程接收Event; |
MAIN | 在主线程接收Event;如果主线程发送要阻塞主线程,需要尽快返回; |
MAIN_ORDERED | 在主线程接收Event;但是不会阻塞主线程,而是加入Handler中,按序发送; |
BACKGROUND | 在主线程发送Event,则加入队列在后台线程排序,不可执行耗时任务;如果在非主线程执行,则在该线程执行任务; |
ASYNC | subscriber执行不阻塞发送线程;使用线程池管理线程; |
来源:CSDN
作者:hyzhangdut
链接:https://blog.csdn.net/u011322020/article/details/104478334