iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 >Android EventBus粘性事件实现机制探究
  • 709
分享到

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

事件eventbusAndroid 2022-06-07 20:06:05 709人浏览 安东尼
摘要

目录postSticky()内部机制postSticky()小结reGISter内部机制register小结总结众所周知,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粘性事件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


--结束END--

本文标题: Android EventBus粘性事件实现机制探究

本文链接: https://www.lsjlt.com/news/30551.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现EventBus登录界面与传值(粘性事件)
    本文实例为大家分享了Android实现EventBus登录界面与传值的具体代码,供大家参考,具体内容如下展示效果添加EventBus导入依赖compile 'org.greenrobot:eventbus:3.0.0'...
    99+
    2023-05-30
    android eventbus 登录
  • Android 深入探究自定义view之事件的分发机制与处理详解
    目录题引Activity对事件的分发过程父布局拦截的分发处理过程ACTION_DOWN 事件ACTION_MOVE 事件父布局不拦截时的分发处理过程ACTION_DOWNACTION...
    99+
    2024-04-02
  • android点击事件传递机制怎么实现
    Android的点击事件传递机制是通过View的dispatchTouchEvent方法和onTouchEvent方法实现的。首先,...
    99+
    2023-10-20
    android
  • android中事件分发机制的实现原理是什么
    android中事件分发机制的实现原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。android中的事件处理,以及解决滑动冲突问题都离不开事件分发机制,androi...
    99+
    2023-05-30
    android
  • 深入探究Python底层技术:如何实现事件驱动编程
    Python是一种高级编程语言,被广泛用于开发各种应用程序。在Python编程语言中,事件驱动编程被认为是一种非常高效的编程方式。它是一种编写事件处理程序的技术,其中程序代码按照事件的发生顺序执行。事件驱动编程的原理事件驱动编程是一种应用程...
    99+
    2023-11-08
    Python 事件驱动编程 底层技术
  • 浅谈用java实现事件驱动机制
    由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没...
    99+
    2023-05-31
    java 事件处理机制 ava
  • 深入探究 RocketMQ 事务机制的实现流程,为什么它能做到发送消息零丢失?
    本文来自狸猫技术窝专栏《从零开始带你成为消息中间件实战高手》,是作者原子弹大侠开放的试读1、解决消息丢失的第一个问题:订单系统推送消息领丢失既然我们已经明确了消息在基于MQ传输的过程中可能丢失的几个地方,那么我们接着就得一步一步考虑如何去解...
    99+
    2023-06-03
  • SAP CRM的事件注册机制怎么实现
    本篇内容介绍了“SAP CRM的事件注册机制怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Subject: Agent inbox在...
    99+
    2023-06-04
  • Thinkphp事件机制两种实现方式详解
    目录一、通过监听二、通过订阅1、创建订阅类2、配置监听3、触发监听4、处理监听逻辑4.1 自动绑定4.2 手动绑定总结事件机制的实现有两种途径:通过监听、通过订阅 一、通过监听 1、...
    99+
    2024-04-02
  • 如何实现Flex键盘事件的监听机制
    这篇文章给大家分享的是有关如何实现Flex键盘事件的监听机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex键盘事件的监听Flex的事件监听机制很完善,下面主要简单的讲一下Flex键盘事件的监听。首先,要理...
    99+
    2023-06-17
  • 深入探究len函数在Python中的实现原理:深入理解其底层机制
    深入理解Python中的len函数:掌握其底层实现原理,需要具体代码示例 引言:Python是一门简洁、易读、容易上手的编程语言。在Python中,len()函数是一种非常常用的内置函数,用于返回某个容器对象(如字符串、列表、元...
    99+
    2024-01-13
    Python len函数 底层实现原理
  • 怎么在IOS中使用RunLoop实现事件循环机制
    这篇文章给大家介绍怎么在IOS中使用RunLoop实现事件循环机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Source1Timer事件外部手动唤醒线程刚被唤醒之后也要发送一个通知告诉观察者,然后处理唤醒时收到的消...
    99+
    2023-06-15
  • Knative Eventing中怎么实现一个Registry 事件注册机制
    Knative Eventing中怎么实现一个Registry 事件注册机制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景作为事件消费者,之前是无法事先知道哪些事件可以被消...
    99+
    2023-06-19
  • Node异步和事件循环的底层实现和执行机制实例分析
    这篇文章主要讲解了“Node异步和事件循环的底层实现和执行机制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node异步和事件循环的底层实现和执行机...
    99+
    2024-04-02
  • C++使用标准库实现事件和委托以及信号和槽机制
    目录1 .Net的委托和事件2.Qt的信号和槽3.Duilib中委托和事件4.使用C++标准库简单实现事件触发机制5.总结在日常的程序开发中我们经常会遇到以下的实际问题: 比如在一个...
    99+
    2022-11-13
    C++标准库实现事件委托 C++标准库实现信号 槽机制 C++ 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作