EventBus源码解析

  • 时间:
  • 浏览:1
  • 来源:uu快3官网pk10_uu快3官方邀请码_官网ios版

在该依据 中,最终还是会调用eventBus.invokeSubscriber调用事件避免函数。

好了,查找事件避免函数的过程之前 完了,亲戚亲戚当一群人继续回到register依据 中:

在EventBus的构造函数中,亲戚亲戚当一群人看一遍mainThreadPoster初始化的之前 ,传入的是Looper.getMainLooper()。很久 此Handle是运行在主程序运行中的。

PostingThreadState富含 了一2个事件队列eventQueue和你你这个标志信息。eventQueue存放所有待post的事件对象。

enqueue依据 最终会调用sendMessage依据 ,很久 该Handle的handleMessage依据 会被调用。



currentPostingThreadState是一2个ThreadLocal类型,中间存储了PostingThreadState;

中间之前 分析了EventBus的register和post过程,你你这个2个过程是EventBus的核心。不必能 订阅事件时不能 注销事件注册:

前面一篇文章讲解了EventBus的使用,你你这个作为开发人员,没人只听候在仅仅会用的层面上,亲戚亲戚当一群人还不能 弄清楚它的外部实现原理。很久 本篇博文将分析EventBus的源码,看看究竟它是怎么可不上能实现“发布/订阅”功能的。

该依据 主很久 根据register注册的事件避免函数的程序运行模型在指定的程序运行中触发事件避免函数。在上一讲

亲戚亲戚当一群人再回到post依据 ,首先会将event对象加上到事件队列eventQueue中。你你这个判断不是有事件正在post,之前 没人则会遍历eventQueue中每一2个event对象,你你这个调用postSingleEvent依据 post该事件。

该依据 首先获取获取传进来参数的Class对象,你你这个判断该类不是匿名外部类。你你这个根据你你这个2个参数通过subscriberMethodFinder.findSubscriberMethods依据 获取所有的事件避免依据 。

你你这个依据 很简单,很久 查找eventClass类的所有父类和接口,并将其保存到eventTypesCache中,方便下次使用。

在postSingleEventForEventType依据 中,会已eventClass为key从 subscriptionsByEventType对象中获取Subscription列表。在中间讲register的之前 亲戚亲戚当一群人之前 看一遍 EventBus在register的之前 会将Subscription列表存储在subscriptionsByEventType中。接下来会遍历 subscriptions列表你你这个调用postToSubscription依据 进行下一步避免。

EventBus对外提供了一2个register依据 来进行事件注册,该依据 接收一2个Object类型的参数,下面看下register依据 的源码:

亲戚亲戚当一群人再回到postSingleEvent依据 。不管允不允许事件继承,完会执行postSingleEventForEventType依据 post事件。

中之前 讲过EventBus的程序运行模型相关概念了,不明白的都不能 回去看看。

之前 允许事件继承,则会调用lookupAllEventTypes查找所有的父类和接口类。

之前 事件避免函数设置了“sticky = true”,则会调用checkPostStickyEventToSubscription避免粘性事件。

根据前一讲EventBus使用详解亲戚亲戚当一群人之前 知道EventBus使用首先是不能 注册的,注册事件的代码如下:

你你这个依据 中间有个INDEX对象,亲戚亲戚当一群人看看它是个那些鬼:

register过程讲之前 ,亲戚亲戚当一群人知道了EventBus怎么可不上能找到亲戚亲戚当一群人定义好的事件避免函数。有了那些事件避免函数,当post相应事件的之前 ,EventBus就会触发订阅该事件的避免函数。具体post过程是怎么可不上能的呢?亲戚亲戚当一群人看看代码:

该依据 主要作用很久 找出subscriberClass类以及subscriberClass的父类中所有的事件避免依据 (加上了 @Subscribe注解,访问修饰符为public你你这个没人一2个参数)。值得注意的是:之前 子类与父类中同時 处于了相同事件避免函数,则父类中的不必被 加上到subscriberMethods。

该依据 会调用invokeSubscriber依据 进一步避免:

通过名字亲戚亲戚当一群人就知道你你这个依据 是获取subscriberClass类中所有的事件避免依据 (即使用了@Subscribe的依据 )。该依据 首先会从 缓存METHOD_CACHE中去获取事件避免依据 ,之前 缓存中不处于,则不能 通过findSubscriberMethodsWithIndex之前 findSubscriberMethodsWithReflection依据 获取所有事件避免依据 ,获取到之前 先存入缓存再返回。

相关文章

EventBus使用详解EventBus源码解析

BackgroundPoster和AsyncPoster继承自Runnable,你你这个会在enqueue依据 中调用 eventBus.getExecutorService().execute(this);具体run依据 亲戚亲戚当当一群人不能 自己去看源码,最终完会调用 eventBus.invokeSubscriber依据 。亲戚亲戚当一群人看看eventBus.invokeSubscriber依据 的源码:

亲戚亲戚当一群人再返回findSubscriberMethods依据 ,亲戚亲戚当一群人知道INDEX之前 为null了,很久 必然会调用findSubscriberMethodsWithReflection依据 查找所有事件避免函数:

由中间代码都不能 看出EventBus会试图加载一2个de.greenrobot.event.GeneratedSubscriberIndex类 并创建对象赋值给INDEX,你你这个EventBus3.0 beta并没人为亲戚亲戚当一群人提供该类(之前 后续版本会提供)。很久 INDEX为null。

之前 处于粘性事件,则立即调用postToSubscription触发该事件的事件避免函数。postToSubscription函数中间讲post完会讲到。

到这里,EventBus源码亲戚亲戚当一群人之前 分析完了,如有不对的地方还望指点。

mainThreadPoster.enqueue依据 :

亲戚亲戚当一群人主要看看HandlerPoster。

至此,整个register过程就介绍完了。

总结一下,整个过程分为3步:

该依据 最终会通过反射来调用事件避免函数。至此,整个post过程分析完了。

总结一下整个post过程,大致分为3步:

注销事件注册很简单,很久 将register过程注册到EventBus的事件避免函数移除掉。

找到事件避免函数后,会遍历找到的所有事件避免函数并调用subscribe依据 将所有事件避免函数注册到EventBus中。

mainThreadPoster、 backgroundPoster和asyncPoster分别是HandlerPoster、BackgroundPoster和 AsyncPoster的对象,其中HandlerPoster继承自Handle,BackgroundPoster和AsyncPoster继承自 Runnable。