EventBus源码解析(对应3.2.0版本)

亡梦爱人 提交于 2020-02-24 20:19:35

1. 注册EventBus: register(Object subscriber)

  1. 获取该subscriber的SubscribeMethod列表;List<SubscriberMethod> subscriberMethods
    1. 执行subscriberMethodFinder.findSubscriberMethods(subscriberClass)获取List<SubscriberMethod>;
    2. 执行findUsingReflectionInSingleClass()反射获取subscriber中所有methods,Subscribe注解的Method会记录在SubscriberMethodFinder.FindState.subscriberMethods()
  2. 遍历SubscribeMethod列表执行subscribe(subscriber, subscriberMethod)
    1. 更新Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType,该字段表示:某个Event对应哪些@Subscribe注解的方法;
    2. 更新Map<Object, List<Class<?>>> typesBySubscriber,该字段表示:register过的类接收哪些Event;该字段的作用:1> 判断是否注册过; 2>注销时辅助subscriptionsByEventType删除对应event的Subscription;
  3. 对于sticky的subscription,注册时检查stickyEvents中是否包含subscriberMethod.eventType的最近事件,如果有立即发出postToSubscription()
  4. unregister(Object subscriber) 相对简单,从subscriptionsByEventType和typesBySubscriber中删除相应subscriber;
  5. 重复register()会crash,重复unregister()则不会;

2. 发送、接收Event:post(Object event)

  1. post(Object event)ThreadLocal<PostingThreadState> 类型变量currentPostingThreadState的eventQueue列表会接收event;Event依次从eventQueue取出,执行postSingleEvent()

  2. postSingleEvent(Object event, PostingTHreadState postingState) 中获取Event Class列表:lookupAllEventTypes(eventClass), 该列表包含eventClass、递归父类class直到Object;遍历列表,执行postSingleEventForEventType()方法;

  3. postSingleEventForEventType(Event, PostingThreadState, eventClass)根据eventClass,从subscriptionsByEventType获取Subscriptions列表, 遍历执行postToSubscription()

  4. postToSubscription(Subscription subscription, Object event, boolean isMainThread)根据subscription.subscriberMethod.threadMode 和 isMainThread 判断,决定event发送线程;

  5. 最终都是反射构造出注册的方法(@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执行不阻塞发送线程;使用线程池管理线程;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!