EventBus3.0源码详解

news2024/11/26 13:58:45

详解之前要说明一下,LivedataBus 比EventBus更适合目前jetpack化的app,因为考虑到组件的生命周期处理,性能方面,EventBus还是要反射invoke的调用的,网上找不到有实测过的博文,我想来个性能对比实测,然后写一篇博文分享给大家,想看的可以评论留言,我看看有多少人支持。想了解LiveDataBus的小伙伴可以看我这篇文章:Livedata和LivedataBus源码详解,那为什么还要分析EventBus,因为经典永不过时,里面的思想技巧还是值得学习的。
好了步入正题,整个框架运用了多个设计模式:首先从Eventbus的使用入手Eventbus.getDefault()方法,使用了带volatile的双重检验的单例模式,是线程安全的。这是
下 图中第一处,第二处开始使用了Builder模式
在这里插入图片描述
在这里插入图片描述
下图是具体的builder模式
在这里插入图片描述
然后就是register方法了,看下图中,根据订阅者对象找到它的有@Subsribe注解的方法集合,然后for循环调用subscribe订阅的方法。
在这里插入图片描述
我们看一下findSubscriberMethods下图中1是先从缓存中取,然后再是2,如果ignoreGeneratedIndex=true 通过反射来取,false的时候就通过index来取,最后是3数据入缓存,给下次使用。

在这里插入图片描述
我们重点看一下通过index 取的方法findUsinginfo,如下图,调用了getSubscriberInfo方法
在这里插入图片描述
沿着这条线,我们找到了subscriberInfoIndexes

在这里插入图片描述
它是一个list数据结构,而且只有通过SubscriberMethodFinder的构造方法赋值。
在这里插入图片描述
然后我们找到构造方法赋值的地方,哦用的是EventbusBuilder的 subscriberInfoIndexes

在这里插入图片描述
而它又是由addindex方法来添加item的。
在这里插入图片描述
下图注意是EventbusPerformance里面是在使用EventBus,看一下这个MyEventIndex
在这里插入图片描述
这里是apt+javapoet 技术编译生成的java类,代码就是index数据集。那这个名字是在哪指定生成的,我们接着看
在这里插入图片描述
在这指定的哦。
在这里插入图片描述
然后我们看看apt 中的注解处理器吧,现在都换成增量编译注解处理器了,减少了编译时间。
在这里插入图片描述
下图是javapoet 写入java文件中的操作。

在这里插入图片描述
这里需要注意一下, private final Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType; 这个数据类型,先
放一个空的CopyOnWriteArrayList ,然后再这个CopyOnWriteArrayList里面填充数据,数据订阅完成。粘性事件的单拉出来一个map stickyEvents 使用

在这里插入图片描述
订阅的方法看完了,我们看一下post 发布消息的方法,注意下图的细节,用list eventQueue 实际上是currentPostingThreadState.get(). eventQueue 来缓存,这样多个调用这个post的方法的时候就不存在同步的问题,性能上得到了提升。

在这里插入图片描述
下图中又使用了 eventTypesCache map来缓存,这种手法前面说过就不说了,然后是enventinheritance 这是继承事件控制的,感兴趣的可以看看,就是你post这个类如果有子类,接口等的情况的,核心代码还是在postSingleEventForEventType里面

在这里插入图片描述
接下来的代码就没那么绕了
在这里插入图片描述
不同的线程里面 invoke ,所以我说最后还是会反射invoke一下。
在这里插入图片描述
反射中的耗时大概比例我查过了,如下图,也就是说EventBus 的 apt+javapoet 生成的index 代替了反射大部分耗时,但不完全invoke还是有的。

在这里插入图片描述
整个看下来 EventBus 是采用了观察者模式, 作者命名的时候更偏向发布/订阅者模式,我觉得这个命名会更贴切库本身方法的功能意义,可以笼统的认为这两个是别名的关系 ,但如果像网上说的发布订阅者模式强调中间调度者的话,这里严格的说是观察者模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【旅游度假】Axure酒店在线预订APP原型图 旅游度假子模块原型模板

作品概况 页面数量&#xff1a;共 10 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;旅游度假&#xff0c;生活服务 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为「酒店在线预订」的移动端…

【淘宝】商品详情页+商品列表数据采集

作为国内最大的电商平台之一&#xff0c;淘宝数据采集具有多个维度。 有人需要采集商品信息&#xff0c;包括品类、品牌、产品名、价格、销量等字段&#xff0c;以了解商品销售状况、热门商品属性&#xff0c;进行市场扩大和重要决策&#xff1b; 有人需要采集产品评论&…

EndNote(二)【文献导入、全文检索】

在开始之前我们可以先分个组以管理自己的文件&#xff0c;如果不分组的话&#xff0c;它所有的文件都会放在unfiled这个目录下&#xff1a; 如何分组也很简单&#xff1a; 然后给个名字即可&#xff1a; 文献导入&#xff08;五种方法&#xff09; 第一种&#xff1a;pdf直接导…

STM32F4X USART串口使用

STM32F4X USART串口使用 串口概念起始位波特率数据位停止位校验位串口间接线 STM32F4串口使用步骤GPIO引脚复用函数串口初始化函数串口例程 串口概念 串口是MCU与外部通信的重要通信接口&#xff0c;也是MCU在开发过程中的调试利器。串口通信有几个重要的参数&#xff0c;分别…

基于蚁狮算法优化的BP神经网络(预测应用) - 附代码

基于蚁狮算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蚁狮算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蚁狮优化BP神经网络2.1 BP神经网络参数设置2.2 蚁狮算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Chrome如何安装插件(文件夹)

1.下载的插件 说明&#xff1a;插件文件夹 2.打开扩展程序位置 3.点击已加载的扩展程序 说明&#xff1a;找到插件的位置 4.报错 说明&#xff1a;那还要进入文件里面。 5.插件的位置 说明&#xff1a;如果已经安装了插件&#xff0c;那么需要查看插件的位置。chrome输入 …

todesk远程连接出现闪退如何解决

官方提供方案&#xff1a;ToDesk远程桌面软件-免费安全流畅的远程连接电脑手机https://www.todesk.com/faq/88.html 图1 打开上述网址&#xff0c;输入“闪退”进行搜索 图2 超级实用解决方法 &#xff08;本机软件设置一下即可&#xff09; 图3 其实图2就已经解决问题了&…

【汇编语言】CS、IP与代码段

文章目录 两个关键的寄存器在CS和IP指示下代码的运行问答 两个关键的寄存器 CS: 代码段寄存器&#xff1b;IP: 指令指针寄存器&#xff1b;CS:IP : CPU将内存中CS&#xff1a;IP只想的内容当作指令执行&#xff1b; 在CS和IP指示下代码的运行 具体步骤描述&#xff1a; 1、第…

【rust/egui】(四)看看template的app.rs:update以及组件TopBottomPanelButton

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 update update实际上还是eframe::App的…

利用快慢指针,求链表的中间结点,判断链表是否是环形链表

前言 &#xff08;1&#xff09;在学习数据结构链表部分的时候&#xff0c;老师给出了几个题目。其中两个题目采用了快慢指针的技术&#xff0c;感觉有意思&#xff0c;于是写一篇博客记录一下。 快慢指针 &#xff08;1&#xff09;我们先来介绍一下快慢指针技术。这个说起来其…

Java性能分析中常用命令和工具

当涉及到 Java 性能分析时&#xff0c;有一系列强大的命令和工具可以帮助开发人员分析应用程序的性能瓶颈、内存使用情况和线程问题。以下是一些常用的 Java 性能分析命令和工具&#xff0c;以及它们的详细说明和示例。 以下是一些常用的性能分析命令和工具汇总&#xff1a; …

vscode远程调试PHP代码

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …

【⑫MySQL | 约束(二)】外键 | 默认值 | 检查约束 — 综合案例

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL外键 | 默认值 | 检查约束 以及综合案例的分享✨ 目录 前言6. 外键约束(FOREIGN KEY,FK)7. 默认值约束和检查约束8. 综合实战总结 6. 外键约束(FOREIGN KEY,FK) 前面介绍的完整性约束都是在单表中进行设置&…

VB6创建ActiveX exe简单方法

VB6创建的COM即可以是线程内的DLL&#xff0c;也可以是线程外独立的EXE&#xff0c;有些32位的旧东西做activex.exe封装后在新硬件新软件x64位上用还是可以的。其实activex DLL和activeX EXE主要功能并不需要改变。activex DLL可以是如下的样子&#xff1a; 一个主工程文件&…

​​Linux 信号量​​​​

信号量的产生原因 我们将可能会被多个执行流同时访问的资源叫做临界资源&#xff0c;临界资源需要进行保护否则会出现数据不一致等问题。 当我们仅用一个互斥锁对临界资源进行保护时&#xff0c;相当于我们将这块临界资源看作一个整体&#xff0c;同一时刻只允许一个执行流对…

WPF入门到精通:2.WPF常用控件及布局

WPF&#xff08;Windows Presentation Foundation&#xff09;是一个用于构建 Windows 应用程序的框架&#xff0c;它提供了丰富的控件和布局方式&#xff0c;帮助开发者快速构建出现代化的应用程序。 WPF常用控件 Button 控件 WPF 中最常用的控件之一。它由一个文本标签和一个…

设计模式之迭代器模式(Iterator)的C++实现

1、迭代器模式的提出 在软件开发过程中&#xff0c;操作的集合对象内部结构常常变化&#xff0c;在访问这些对象元素的同时&#xff0c;也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类&#xff0c;不同…

list使用

list的使用于string的使用都类似&#xff0c;首先通过查阅来看list有哪些函数&#xff1a; 可以看到函数还是蛮多的&#xff0c;我们值重点一些常用的和常见的&#xff1a; 1.关于push_back,push_front,和对应迭代器的使用 //关于push_back和push_front void test_list1() {l…

算法通关村——字符串反转问题解析

1. 反转字符串 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 1.1 交换 这一题的思路还是简单的&…

Flink状态和状态管理

1.什么是状态 官方定义&#xff1a;当前计算流程需要依赖到之前计算的结果&#xff0c;那么之前计算的结果就是状态。 这句话还是挺好理解的&#xff0c;状态不只存在于Flink&#xff0c;也存在生活的方方面面&#xff0c;比如看到一个认识的人&#xff0c;如何识别认识呢&am…