Android中的EventBus变迁史

news2024/12/27 2:01:49

Android中的EventBus变迁史

什么是EventBus?

EventBus是软件架构中使用的一种通信机制,用于促进系统内不同组件或服务之间的事件交换。它为组件提供了一种发布和订阅事件的方法,从而实现松散耦合和异步通信。

EventBus充当中央集线器或消息代理,允许组件在彼此不直接了解的情况下进行通信。它们不是直接调用彼此的方法或函数,而是将事件发布到事件总线,而对这些事件感兴趣的其他组件则订阅它们。这将发送器和接收器解耦,使系统更加模块化、可扩展且灵活。

EventBus架构图

Android 中EventBus的用途

在 Android 应用程序中,跨应用程序的不同部分访问和操作数据或 UI 元素可能是一种常见的需求。然而,直接与目标组件通信可能会引入紧密耦合和依赖关系,从而降低代码库的可维护性和灵活性。这就是事件总线实现发挥作用的地方。

通过在 Android 应用程序中使用EventBus,开发人员可以实现访问或操作数据和 UI 元素的灵活环境,而无需直接引用目标组件。

当一个组件想要与另一个组件进行通信或触发另一个组件的操作时,它会向EventBus发布事件,而不是直接引用目标组件。该事件可以携带任何相关数据或指令。对该事件感兴趣的其他组件可以订阅该事件,表明它们希望在此类事件发生时得到通知。

Android EventBus变迁史

自定义实现(早期)

早期开发者为了满足他们应用需求,借助接口、回调、广播等Android框架机制实现了EventBus系统。

Otto Event Bus (2012)

  • Square Inc. 推出了 Otto,一个专为 Android 应用程序设计的事件总线库。
  • Otto 通过提供带有注释和自动事件传递的轻量级发布/订阅机制,简化了事件驱动编程。

greenrobot实现的EventBus (2013)

  • greenrobot 的 EventBus 库为 Android 提供了简单且高性能的事件总线实现。
  • 由于其易用性、灵活性以及对各种事件交付模式的支持,它被广泛采用。
  • EventBus 提供了分层事件总线结构,并允许开发人员使用注释发布事件并订阅事件。

RxBus (2015)

  • RxBus 是基于 Android 响应式扩展 (Rx) 的事件总线实现。
  • RxBus 利用 RxJava 和 RxAndroid 的强大功能为事件驱动编程提供反应式方法。
  • 它利用可观察量和订阅者,允许组件订阅事件并以反应方式接收它们

Android Jetpack LiveData (2017)

  • LiveData 是 Android Jetpack 的一部分,充当生命周期感知的数据持有者组件,具有类似事件总线的行为。
  • LiveData 通过自动处理生命周期事件并确保主线程上的 UI 更新来简化事件驱动的通信。

Kotlin Coroutines with SharedFlow(当前)

  • Kotlin 协程通常用于现代 Android 应用程序中的事件驱动编程。
  • SharedFlow 是 Kotlin 协程中的热流,通常用于实现类似事件总线的机制。
  • 使用 SharedFlow,事件可以由发布者发出并由多个订阅者以响应方式接收。

Android 中EventBus实现的优点和缺点

优点

  • 组件之间的松散耦合,促进模块化和可维护性。
  • 通过事件解耦通信,减少直接依赖。
  • 简化异步通信,提高响应能力并防止 UI 阻塞。
  • 事件驱动的架构,使代码库更具可读性和组织性。
  • 跨组件通信,实现应用程序不同部分之间的无缝通信。
    缺点
  • 应用程序架构的复杂性增加。
  • 由于事件分派和处理而产生的潜在性能开销。
  • 在大型项目中,事件类型和订阅的管理可能会变得具有挑战性。
  • 可能的过度使用或误用,导致架构错综复杂。
  • 调试和故障排除可能更具挑战性,需要适当的日志记录和错误处理机制。

结论

Android 中的EventBus是一种有价值的通信机制,它促进组件之间的事件交换,促进松散耦合和模块化。然而,重要的是要考虑潜在的缺点,例如增加的复杂性、性能开销以及需要适当的事件类型管理。尽管如此,通过利用这些优势并解决这些限制,事件总线实现可以极大地增强 Android 应用程序内的架构和通信,从而产生更具可扩展性和可维护性的应用程序。

GitHub

https://github.com/Burak-Tasci/CoroutinesBus

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

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

相关文章

SpringBoot 性能优化的主要组件及特点

SpringBoot 性能优化的主要组件及特点 简介 在开发应用程序时,性能是一个非常重要的因素。如果应用程序的性能不佳,那么它可能会影响用户的体验,甚至会导致系统崩溃。而在 SpringBoot 应用程序中,我们可以通过一些组件来优化应用…

PCB板为什么要做表面处理?你知道吗

PCB板为什么要做表面处理? 由于PCB上的铜层很容易被氧化,因此生成的铜氧化层会严重降低焊接质量,从而降低最终产品的可靠性和有效性,为了避免这种情况的发生,需要对PCB进行表面处理。 常见的表面处理方式包括OSP、喷…

Java虚拟机(JVM)面试题

JVM 说一下 JVM 的主要组成部分及其作用? 总体来说,方法区和堆是所有线程共享的内存区域;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域,运行时数据区域就是我们常说的JVM的内存 类加载子系统:根据…

SpringBoot 使用 MockMvc 进行 Web 集成测试

SpringBoot 使用 MockMvc 进行 Web 集成测试 在 SpringBoot 应用程序中,我们可以使用 MockMvc 进行 Web 集成测试。MockMvc 是一个测试框架,可以模拟 HTTP 请求和响应,并且可以使用 Spring MVC 的控制器进行测试。MockMvc 可以让我们测试 Sp…

Apollo分布式配置中心(一)

目录 什么是配置? 什么是配置中心? 配置中心需要满足条件 什么是Apollo? Apollo特性 Apollo执行流程 Apollo安装 Git地址: 用户手册: 环境准备: 使用idea 的git clone 拉取源码 修改Apollo\scripts…

面对AI,要(能)当“杜兰特”吗?

大家好,我是老三,先说一下这篇文章没什么干货,就是一篇随笔。 今天闲来无事,在掘金上刷到一篇文章:GPT-4都来了,我们还需要刷算法题和背八股文吗?:https://juejin.cn/post/72111208…

总结Linux 中实时查看日志的3种方法

一、前言 我们大家应该都知道如何在 Linux 中查看文件,比如可以使用 cat 或者 less 命令。 这对于查看静态文件来说是可以的;日志文件是动态的,其内容随时会变化,要监测日志文件,需要在日志文件内容改变时也能实时看到…

配置右键菜单功能 :一键csv转excel

配置右键菜单功能 :一键csv转excel 无需点开文件,双击即可以生成新的excel文件 步骤: 1、配置Python,安装依赖库 pip install openpyxl pip install pandas2、创建Python文件 csv_to_excel.py # -*- coding:utf-8 -*- impor…

【光伏集群、需求响应】市场模式下光伏用户群的电能共享与需求响应模型(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

团体程序设计天梯赛-练习集L2篇⑤

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

Vue+leaflet笔记之克里金插值

Vueleaflet笔记之克里金插值 文章目录 Vueleaflet笔记之克里金插值开发环境代码简介组件库简介安装依赖库实现思路turf生成随机数据方法一:kriging库插值方法二:kriging-contour插值(矢量)方法三:kriging-contour插值(栅格) 本文介绍了Web端使…

逆向工具(IDA、pyinstxtractor+uncompyle6、jadx等持续更新)

IDA Pro IDA Pro(Interactive Disassembler Professional)交互式反汇编器专业版,CTF、RE、PWN必备。 打开一个可执行文件前,应先用file命令或者DIE等工具,确定是32位还是64位,然后用相应的IDA工具打开可执…

ModaHub魔搭社区:商业向量数据库产品Pincone的特点与应用

目录 Pincone简介 Pincone有以下几个特点 高性能搜索 全功能管理 轻松扩容 Pincone能干什么? 如何接入Pincone Pincone简介 Pincone 可以算是当前最火的商业向量数据库产品了,它最近获得了1亿美元的B轮融资,估值达到7.5 亿美元&#x…

YOLOv8实战火焰和烟雾检测 (视频教程)

课程链接:https://edu.csdn.net/course/detail/38718 YOLOv8 基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数…

TypeScript 【类型推断】与【类型别名】的使用解读

什么是类型推断? 在 TypeScript 中, 如果声明变量时,没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。 以下代码虽然没有明确指定类型,但是会在编译的…

APK反编译的那些事

谷歌对dex文件的介绍:常量数组/字符串 DEX_FILE_MAGIC 是字节列表,这类字节必须出现在 .dex 文件的开头,以便系统将其原样识别。该值会特意包含一个换行符("\n" 或 0x0a)和空字节("\0"…

单片机原理及接口技术期末复习知识点

第1章 单片机概述 什么是单片机:单片机是由CPU、存储器、I/O接口及总线集成在一个芯片上。简单了解AT89S51单片机简介。 相当于MCS-51系列中的87C51,AT89S51芯片内4KB的Flash存储取代了87C51片内的4K的EPROM。 第2章 AT89S51单片机的内部结构 MCS-51单…

毫米波雷达系统性能参数分析

毫米波雷达系统性能参数分析 1、距离2、速度3、角度 本文主要分析描述雷达系统的系统性能的一些参数,包括最大作用距离,距离分辨率,最大探测速度……等参数。通过理解这些参数的组成,能够帮助我们设计雷达系统参数。 1、距离 &a…

做UI设计要会什么知识?

做UI设计要会什么知识?在互联网这个行业里,要想做好一件事情,做得好是必须要懂产品,懂用户体验。在很多人眼中,做设计就是打杂,干不了,其实不是这样的。要想成为一名优秀的UI设计师,…

Django高级扩展之系统后台使用celery

如果我们在系统后台想某日某时执行某个任务,或者每隔一段时间执行某个任务,可以使用celery来完成。 目录 安装 安装celery 安装django_celery_beat celery配置 注册应用 celery配置 修改__init__.py 表迁移 执行迁移 控制台运行截图 新增数据…