EventBus源码解析

  • 时间:
  • 浏览:0

底下之后分析了EventBus的register和post过程,这有一个过程是EventBus的核心。不前要订阅事件时前要撤除事件注册:

之后居于粘性事件,则立即调用postToSubscription触发该事件的事件处置函数。postToSubscription函数底下讲post时会讲到。

让让.我再回到post措施,首先会将event对象加带到事件队列eventQueue中。之后判断是算不算有事件正在post,之后沒有则会遍历eventQueue中每有一个event对象,之后调用postSingleEvent措施post该事件。

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

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



currentPostingThreadState是有一个ThreadLocal类型,底下存储了PostingThreadState;

该措施最终会通过反射来调用事件处置函数。至此,整个post过程分析完了。

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

相关文章

EventBus使用详解EventBus源码解析

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

该措施首先获取获取传进来参数的Class对象,之后判断该类是算不算匿名外部类。之后根据这有一个参数通过subscriberMethodFinder.findSubscriberMethods措施获取所有的事件处置措施。

在该措施中,最终还是会调用eventBus.invokeSubscriber调用事件处置函数。

你这人措施底下有个INDEX对象,让让.我看看它是个哪几种鬼:

到这里,EventBus源码让让.我之后分析完了,如有不对的地方还望指点。

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

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

enqueue措施最终会调用sendMessage措施,之后 该Handle的handleMessage措施会被调用。

前面一篇文章讲解了EventBus的使用,之后作为开发人员,只有只等候在仅仅会用的层面上,让让.我还前要弄清楚它的外部实现原理。之后 本篇博文将分析EventBus的源码,看看究竟它是咋样实现“发布/订阅”功能的。

在EventBus的构造函数中,让让.我看了mainThreadPoster初始化的之后,传入的是Looper.getMainLooper()。之后 此Handle是运行在主系统任务管理器中的。

register过程讲之后,让让.我知道了EventBus咋样找到让让.我定义好的事件处置函数。有了哪几种事件处置函数,当post相应事件的之后,EventBus就会触发订阅该事件的处置函数。具体post过程是咋样的呢?让让.我看看代码:

该措施会调用invokeSubscriber措施进一步处置:

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

让让.我主要看看HandlerPoster。

BackgroundPoster和AsyncPoster继承自Runnable,随时会在enqueue措施中调用 eventBus.getExecutorService().execute(this);具体run措施让让.我还都能能 被委托人去看源码,最终时会调用 eventBus.invokeSubscriber措施。让让.我看看eventBus.invokeSubscriber措施的源码:

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

在postSingleEventForEventType措施中,会已eventClass为key从 subscriptionsByEventType对象中获取Subscription列表。在底下讲register的之后让让.我之后看了 EventBus在register的以时会将Subscription列表存储在subscriptionsByEventType中。接下来会遍历 subscriptions列表之后调用postToSubscription措施进行下一步处置。

让让.我再返回findSubscriberMethods措施,让让.我知道INDEX之后为null了,之后 必然会调用findSubscriberMethodsWithReflection措施查找所有事件处置函数:

该措施主之后 根据register注册的事件处置函数的系统任务管理器模型在指定的系统任务管理器中触发事件处置函数。在上一讲

找到事件处置函数后,会遍历找到的所有事件处置函数并调用subscribe措施将所有事件处置函数注册到EventBus中。

好了,查找事件处置函数的过程之后完了,让让.我继续回到register措施中:

该措施主要作用之后 找出subscriberClass类以及subscriberClass的父类中所有的事件处置措施(加带了 @Subscribe注解,访问修饰符为public之后只有有一个参数)。值得注意的是:之后子类与父类中同时居于了相同事件处置函数,则父类中的不用被 加带到subscriberMethods。

让让.我再回到postSingleEvent措施。不管允不允许事件继承,时会执行postSingleEventForEventType措施post事件。

根据前一讲EventBus使用详解让让.我之后知道EventBus使用首先是前要注册的,注册事件的代码如下:

中之后讲过EventBus的系统任务管理器模型相关概念了,不明白的还都能能 回去看看。

你这人措施很简单,之后 查找eventClass类的所有父类和接口,并将其保存到eventTypesCache中,方便下次使用。

mainThreadPoster.enqueue措施:

通过名字让让.我就知道你这人措施是获取subscriberClass类中所有的事件处置措施(即使用了@Subscribe的措施)。该措施首先会从 缓存METHOD_CACHE中去获取事件处置措施,之后缓存中不居于,则前要通过findSubscriberMethodsWithIndex之后 findSubscriberMethodsWithReflection措施获取所有事件处置措施,获取到之后先存入缓存再返回。

由底下代码还都能能 看出EventBus会试图加载有一个de.greenrobot.event.GeneratedSubscriberIndex类 并创建对象赋值给INDEX,之后EventBus3.0 beta并沒有为让让.我提供该类(随时候续版本会提供)。之后 INDEX为null。

撤除事件注册很简单,之后 将register过程注册到EventBus的事件处置函数移除掉。