EventBus源码解析

  • 时间:
  • 浏览:0

该法律法律依据会调用invokeSubscriber法律法律依据进一步处里:

将会事件处里函数设置了“sticky = true”,则会调用checkPostStickyEventToSubscription处里粘性事件。

并且 人再回到postSingleEvent法律法律依据。不管允不允许事件继承,回会执行postSingleEventForEventType法律法律依据post事件。

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

PostingThreadState所含了有另一俩个事件队列eventQueue和并且 标志信息。eventQueue存放所有待post的事件对象。

根据前一讲EventBus使用详解并且 人将会知道EventBus使用首先是需要注册的,注册事件的代码如下:

好了,查找事件处里函数的过程将会完了,并且 人继续回到register法律法律依据中:

在该法律法律依据中,最终还是会调用eventBus.invokeSubscriber调用事件处里函数。

由顶端代码能要能看出EventBus会试图加载有另一俩个de.greenrobot.event.GeneratedSubscriberIndex类 并创建对象赋值给INDEX,并且EventBus3.0 beta并没法为并且 人提供该类(将会后续版本会提供)。统统INDEX为null。

该法律法律依据主统统根据register注册的事件处里函数的线程池池模型在指定的线程池池中触发事件处里函数。在上一讲

并且 人再返回findSubscriberMethods法律法律依据,并且 人知道INDEX将会为null了,统统必然会调用findSubscriberMethodsWithReflection法律法律依据查找所有事件处里函数:

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

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

前面一篇文章讲解了EventBus的使用,并且作为开发人员,要能要能只等候在仅仅会用的层面上,并且 人还需要弄清楚它的内部内部结构实现原理。统统本篇博文将分析EventBus的源码,看看究竟它是如何实现“发布/订阅”功能的。

顶端将会分析了EventBus的register和post过程,这有另一俩个过程是EventBus的核心。需要订阅事件需要要退还事件注册:

并且 人再回到post法律法律依据,首先会将event对象添加到事件队列eventQueue中。并且判断是是是不是事件正在post,将会没法则会遍历eventQueue中每有另一俩个event对象,并且调用postSingleEvent法律法律依据post该事件。

相关文章

EventBus使用详解EventBus源码解析

什儿 法律法律依据顶端有个INDEX对象,并且 人看看它是个那先 鬼:

mainThreadPoster.enqueue法律法律依据:

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

在postSingleEventForEventType法律法律依据中,会已eventClass为key从 subscriptionsByEventType对象中获取Subscription列表。在顶端讲register的时候 并且 人将会看完 EventBus在register的时候 会将Subscription列表存储在subscriptionsByEventType中。接下来会遍历 subscriptions列表并且调用postToSubscription法律法律依据进行下一步处里。

该法律法律依据主要作用统统找出subscriberClass类以及subscriberClass的父类中所有的事件处里法律法律依据(添加了 @Subscribe注解,访问修饰符为public并且要能要能另一俩个参数)。值得注意的是:将会子类与父类中一同处于了相同事件处里函数,则父类中的不要被 添加到subscriberMethods。

通过名字并且 人就知道什儿 法律法律依据是获取subscriberClass类中所有的事件处里法律法律依据(即使用了@Subscribe的法律法律依据)。该法律法律依据首先会从 缓存METHOD_CACHE中去获取事件处里法律法律依据,将会缓存中不处于,则需要通过findSubscriberMethodsWithIndex将会 findSubscriberMethodsWithReflection法律法律依据获取所有事件处里法律法律依据,获取到时候 先存入缓存再返回。

退还事件注册很简单,统统将register过程注册到EventBus的事件处里函数移除掉。

到这里,EventBus源码并且 人将会分析完了,如有不对的地方还望指点。

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

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

BackgroundPoster和AsyncPoster继承自Runnable,并且会在enqueue法律法律依据中调用 eventBus.getExecutorService().execute(this);具体run法律法律依据并且 人能要能另一方去看源码,最终回会调用 eventBus.invokeSubscriber法律法律依据。并且 人看看eventBus.invokeSubscriber法律法律依据的源码:

中将会讲过EventBus的线程池池模型相关概念了,不明白的能要能回去看看。

在EventBus的构造函数中,并且 人看完mainThreadPoster初始化的时候 ,传入的是Looper.getMainLooper()。统统此Handle是运行在主线程池池中的。

register过程讲时候 ,并且 人知道了EventBus如何找到并且 人定义好的事件处里函数。有了那先 事件处里函数,当post相应事件的时候 ,EventBus就会触发订阅该事件的处里函数。具体post过程是如何的呢?并且 人看看代码:

什儿 法律法律依据很简单,统统查找eventClass类的所有父类和接口,并将其保存到eventTypesCache中,方便下次使用。

该法律法律依据首先获取获取传进来参数的Class对象,并且判断该类是是不是匿名内部内部结构类。并且根据这有另一俩个参数通过subscriberMethodFinder.findSubscriberMethods法律法律依据获取所有的事件处里法律法律依据。

enqueue法律法律依据最终会调用sendMessage法律法律依据,统统该Handle的handleMessage法律法律依据会被调用。

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



currentPostingThreadState是有另一俩个ThreadLocal类型,顶端存储了PostingThreadState;

将会处于粘性事件,则立即调用postToSubscription触发该事件的事件处里函数。postToSubscription函数顶端讲post回会讲到。

并且 人主要看看HandlerPoster。

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