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

4 篇文章 0 订阅
0 篇文章 0 订阅
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,则加入队列在后台线程排序,不可执行耗时任务;如果在非主线程执行,则在该线程执行任务;
ASYNCsubscriber执行不阻塞发送线程;使用线程池管理线程;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值