Android EventBus粘性事件实现机制探究

目录
  • postSticky()内部机制
  • postSticky()小结
  • register内部机制
  • register小结
  • 总结

众所周知,EventBus是支持粘性事件的,即可以先发送粘性事件,然后再注册,代码如下:

  • 粘性事件观察者
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun registerEventBus(o: Any) {
}
  • 发送粘性事件
EventBus.getDefault().postSticky(Any())
  • 注册EventBus
EventBus.getDefault().register(this)

接下来我们就来探究下EventBus的粘性事件是如何实现的。

postSticky()内部机制

  • 如果是发送的粘性事件,会添加到stickyEvents中,看下这个属性的实现:

可以看到这个属性是一个Map集合,其中key为事件类型的class对象,value为对应的事件类型。

  • 继续看下post(Event)方法:

  • 首先将这个粘性事件添加到PostingThreadState(线程私有)的eventQueue集合中
  • 通过isMainThread方法判断当前是否为主线程,最终会调用到我们熟悉的Looper.getMainLooper() == Looper.myLooper()进行判断
  • 循环遍历eventQueue队列,不断的取出集合元素进行分发,看下postSinleEvent()方法如何实现:

  • 如果eventInheritance为true,会查找当前发送的粘性事件类型的父类型,并返回查找到的集合
  • 接下来就会调用postSingleEventForEventType()方法来进行最终粘性事件的分发,即通知通过@Subscribe注解注册的粘性事件观察者,看下具体实现:

  • 调用subscriptionsByEventType获取注册该事件类型的所有订阅方法,但是由于这个时候我们是先发送的粘性事件再注册EventBus,而subscriptionsByEventType中集合元素的填充实在注册EventBus发生的,所以通过subscriptionsByEventType获取到的subscriptions将是null的,所以接下来肯定不会走下面的if代码块中的逻辑了。

postSticky()小结

上面这么多代码逻辑,其实只干了一件事,就是将这个粘性事件添加到了stickyEvents这个集合中。之后的逻辑虽多,但和粘性事件没啥关系。

register内部机制

  • findSubscriberMethods()这个方法里面的逻辑就不带大家进行分析了,总之就干了一件事情:

查找当前类通过@Subscribe注册的所有事件订阅方法,并返回一个List<SubscriberMethod>集合,其中SubscriberMethod就是对每个注册的订阅方法和当前注册类的封装

  • subscribe这个方法是关键,深入探究下:

  • 第1、2、3、4步中其实就干了两件事情:

    • 填充subscriptionsByEventType集合,key为事件类型,value为通过@Subscribe订阅了该事件类型的方法集合
    • 填充typesBySubscriber集合,key为注册EventBus的类,value为该类中所有@Subscribe注解修饰的方法集合
  • 第5步就是实现粘性事件分发的关键地方
    • 首先判断当前@Subscribe修饰的订阅方法是否为粘性,即@Subscribe(sticky = true)sticky等于true
    • 是的话就从stickyEvents集合中判断是否存在和订阅方法中注册的事件类型相同的事件:

    这个stickyEvents是不是很熟悉,就是我们之前发送粘性事件时,将粘性事件添加到的方法集合

    • 如果存在,则就执行该粘性事件的分发,即调用执行该订阅方法,最终会调用到invokeSubscriber()方法:

从上面可以看到,最终是通过反射来实现的订阅了粘性事件方法的执行。

register小结

该方法最终会判断当前是否存在注册EventBus前发送的粘性事件,且当前注册类中存在订阅该事件类型的方法,然后立即执行。

总结

以上就是EventBus粘性事件的内部实现机制,总体来说不算复杂,大家看着文章跟着源码一步步分析应该就很容易理解这部分实现逻辑了。

到此这篇关于Android EventBus粘性事件实现机制的文章就介绍到这了,更多相关Android EventBus粘性事件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现EventBus登录界面与传值(粘性事件)

    本文实例为大家分享了Android实现EventBus登录界面与传值的具体代码,供大家参考,具体内容如下 展示效果 添加EventBus导入依赖 compile 'org.greenrobot:eventbus:3.0.0' 主MainActivity方法 public class MainActivity extends AppCompatActivity { private EditText username,password; private Button btn_go; private

  • Android EventBus(普通事件/粘性事件)详解

    本文实例为大家分享了Android EventBus普通事件和粘性事件,供大家参考,具体内容如下 展示效果 添加EventBus导入依赖 compile 'org.greenrobot:eventbus:3.0.0' 主MainActivity方法 public class MainActivity extends AppCompatActivity { private Button button_t,button_d; private TextView tv_a; @Override prot

  • Android EventBus粘性事件实现机制探究

    目录 postSticky()内部机制 postSticky()小结 register内部机制 register小结 总结 众所周知,EventBus是支持粘性事件的,即可以先发送粘性事件,然后再注册,代码如下: 粘性事件观察者 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) fun registerEventBus(o: Any) { } 发送粘性事件 EventBus.getDefault().postSticky(Any())

  • 详细分析Android中onTouch事件传递机制

    onTach介绍 ontach是Android系统中整个事件机制的基础.Android中的其他事件,如onClick.onLongClick等都是以onTach为基础的. onTach包括从手指按下到离开手机屏幕的整个过程,在微观形式上,具体表现为action_down.action_move和action_up等过程. onTach两种主要定义形式如下: 1.在自定义控件中,常见的有重写onTouchEvent(MotionEvent ev)方法.如在开发中经常可以看到重写的onTouchEv

  • 解析Android点击事件分发机制

    开头说说初衷 网上关于点击事件分发的文章一搜一大堆,标题一看,不是"30分钟让你弄明白XXX"就是"这是讲解XXX最好的文章",满怀憧憬与信心,忍不住兴奋的点进去一看,发现不是代码就全是图,我基本上看完了所有相关的文章,结果硬是看了三个小时也没搞懂.所以最后还是决定自己去试一试,看一看点击事件分发到底是怎么个流程,我写的肯定不会比其他文章好多少,但是呢,带着一个初学者的心,去分析这个东西,自己能弄明白的同时,也让想学习这个的人看了之后有些许收获,那就足够了. 运行的

  • 聊聊Android中的事件分发机制

    View事件分发机制的本质就是就是MotionEvent事件的分发过程,即MotionEvent产生后是怎样在View之间传递及处理的. 首先介绍一下什么是MotionEvent.所谓MotionEvent,即用户手指触碰手机屏幕时产生的一系列触摸事件.典型的触摸事件有: ACTION_DOWN:手指刚接触屏幕的一瞬间. ACTION_MOVE:手指在屏幕上滑动. ACTION_UP:手指离开屏幕的一瞬间. ACTION_CANCLE:当前事件序列终止. 一个事件序列一般都是以DOWN事件开始,

  • Android View的事件分发机制

    一.Android View框架提供了3个对事件的主要操作概念. 1.事件的分发机制,dispatchTouchEvent.主要是parent根据触摸事件的产生位置,以及child是否愿意负责处理该系列事件等状态,向其child分发事件的机制. 2.事件的拦截机制,onInterceptTouchEvent.主要是parent根据它内部的状态.或者child的状态,来把事件拦截下来,阻止其进一步传递到child的机制. 3.事件的处理机制,onTouchEvent.主要是事件序列的接受者(可以是

  • Android点击事件派发机制源码分析

    概述 一直想写篇关于Android事件派发机制的文章,却一直没写,这两天刚好是周末,有时间了,想想写一篇吧,不然总是只停留在会用的层次上但是无法了解其内部机制.我用的是4.4源码,打开看看,挺复杂的,尤其是事件是怎么从Activity派发出来的,太费解了.了解Windows消息机制的人会发现,觉得Android的事件派发机制和Windows的消息派发机制挺像的,其实这是一种典型的消息"冒泡"机制,很多平台采用这个机制,消息最先到达最底层View,然后它先进行判断是不是它所需要的,否则就

  • Android事件传递机制

    实验环境 OS X 10.9 Eclipse(ADT) Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTIO

  • Android从源码的角度彻底理解事件分发机制的解析(上)

    其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?等等--对于这些问题,我并没有给出非常详细的回答,因为我知道如果想要彻底搞明白这些问题,掌握Android事件分发机

  • Android事件分发机制(下) View的事件处理

    综述 在上篇文章Android中的事件分发机制(上)--ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析.在文章的最后ViewGroup的dispatchTouchEvent方法调用dispatchTransformedTouchEvent方法成功将事件传递给ViewGroup的子View.并交由子View进行处理.那么现在就来分析一下子View接收到事件以后是如何处理的. View的事件处理 对于这里描述的View,它是ViewGroup的父类,并不包含任何的子元

随机推荐