EventBus简单介绍

news/2023/5/28 7:20:00

EventBus简单介绍

  • EventBus简单介绍
  • EventBus作用
  • EventBus优缺点
  • EventBus使用步骤
  • EventBus的三要素(三个角色)
    • Event
    • Subscriber
    • Publisher
  • EventBus线程模式
  • 注册事件
  • 发送事件
  • 处理事件
  • 黏性事件

EventBus简单介绍

EventBus 是一个开源库,它利用发布/订阅者模式来对项目进行解耦。它可以利用很少的代码,来实现多组件间通信。

EventBus作用

  • EventBus是一个Android事件发布/订阅轻量级框架
  • 通过解耦发布者和订阅者简化Android事件传递
  • EventBus可以代替Android中Intent、Handler、Broadcast或接口函数,在Fragment、Activity、Service线程之间传递数据,执行方法
  • 当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件

EventBus优缺点

优点:

  • 简化了组件间交流的方式
  • 对事件通信双方进行解耦
  • 可以灵活方便的指定工作线程,通过ThreadMode
  • 速度快,性能好
  • 库比较小,不占内存
  • 使用这个库的app多,有权威性
  • 功能多,使用方便

缺点:

  • 使用的时候有定义很多event类
  • event在注册的时候会调用反射去遍历注册对象的方法在其中找出带有@subscriber标签的方法,性能不高
  • 需要自己注册和反注册,如果忘了反注册就会导致内存泄漏

EventBus使用步骤

平常使用这个库只是很浅显的操作三部曲:register,post,unregister

  • 自定义一个事件类型:class MessageEvent{}
  • 在需要订阅事件的地方注册事件:EventBus.getDefault().register(this);
  • 发送事件:EventBus.getDefault().post(messageEvent);
  • 处理事件@Subscribe(threadMode = ThreadMode.MAIN)(添加注解@Subscriber,要指定线程模型默认为POSTING)
  • 注销事件:EventBus.getDefault().unregister(this)

EventBus的三要素(三个角色)

Event

Event:事件。可以是任意类型的对象。

Subscriber

Subscriber:事件订阅者。在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,它们分别代表4中线程模型。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING)。4种线程模型下面会讲到。

Publisher

Publisher:事件发布者。可以在任意线程位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就可以。根据post函数参数的类型,会自动调用订阅相应类型的事件的函数。

EventBus线程模式

  • ThreadMode.POSTING:订阅者方法将在发布事件所在的线程中被调用。这是默认的线程模式。事件的传递是同步的,一旦发布事件,所有该模式的订阅者方法都将被调用。这种线程模式意味着最少的性能开销,因为它避免了线程的切换。因此,对于不要求是主线程并且耗时很短的简单任务推荐使用该模式。使用该模式的订阅者方法应该快速返回,以避免阻塞发布事件的线程,这可能是主线程。
  • ThreadMode.MAIN:订阅者方法将在主线程(UI线程)中被调用。因此,可以在该模式的订阅者方法中直接更新UI界面。如果发布事件的线程是主线程,那么该模式的订阅者方法将被直接调用。使用该模式的订阅者方法必须快速返回,以避免阻塞主线程。
  • ThreadMode.MAIN_ORDERED:订阅者方法将在主线程(UI线程)中被调用。因此,可以在该模式的订阅者方法中直接更新UI界面。事件将先进入队列然后才发送给订阅者,所以发布事件的调用将立即返回。这使得事件的处理保持严格的串行顺序。使用该模式的订阅者方法必须快速返回,以避免阻塞主线程。
  • ThreadMode.BACKGROUND:订阅者方法将在后台线程中被调用。如果发布事件的线程不是主线程,那么订阅者方法将直接在该线程中被调用。如果发布事件的线程是主线程,那么将使用一个单独的后台线程,该线程将按顺序发送所有的事件。使用该模式的订阅者方法应该快速返回,以避免阻塞后台线程。
  • ThreadMode.ASYNC:订阅者方法将在一个单独的线程中被调用。因此,发布事件的调用将立即返回。如果订阅者方法的执行需要一些时间,例如网络访问,那么就应该使用该模式。避免触发大量的长时间运行的订阅者方法,以限制并发线程的数量。EventBus使用了一个线程池来有效地重用已经完成调用订阅者方法的线程

注册事件

将注册的 Subscriber 保存到 subscriptionsByEventType 和 typesBySubscriber
subscriptionsByEventType 是一个HashMap,key为注册Subscriber监听事件的事件类型eventType,value为所有监听相同事件类型为eventType的Subscriber
typesBySubscriber 是一个HashMap,key为注册Subscriber的当前类MainActivity,value为当前类包含的所有类型Subscriber

发送事件

根据当前发送事件的事件类型,从 subscriptionsByEventType 中获所有监听此事件类型的 Subscriber,遍历这些 Subscriber 并执行 postToSubscription 进行进一步处理,即所有监听此事件的 Subscriber 对应的方法都会被调用

处理事件

使用反射来执行订阅事件 event 的方法 onEvent,这样发送出去的事件就被订阅者 Subscriber 接收并做相应处理了

黏性事件

黏性事件就是在发送事件之后再订阅该事件也能收到该事件,这个事件不会只被消费一次就消失,而是一直存在系统中,直到被 removeStickyEvent 删除掉。


移除某种类型粘性事件:EventBus.getDefault().removeStickyEvent(ThreadMode.xxx);
移除某种对象粘性事件:EventBus.getDefault().removeStickyEvent(object);
移除所有粘性事件:EventBus.getDefault().removeAllStickyEvents();

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

超全!40000字 Matplotlib 实战

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达导读Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几…

筑基一层 —— 高质量C编程建议、详解猜数字游戏

目录 一.修炼必备 二.高质量C编程 2.1 高质量C编程的思维导图(需要思维导图的加qq:972606225获取) 2.2 文件结构 2.3 程序的形式 2.4 命名规则 三.猜数字游戏详解 一.修炼必备 1.入门必备:VS2019社区版,下载地址:Visual S…

数码管显示数字(滚动和静态)

数码管显示数字&#xff08;滚动和静态&#xff09; 1. 8只数码管滚动显示单个数字** 代码&#xff1a; #include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char uchar code table[] {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82…

IPFS BSE分布式存储与流媒体平台宣布合作

近日&#xff0c;DP流媒体平台和BSE分布式存储宣布&#xff0c;合作各方主要由参与安全生产的所有各方。更存储友好吗&#xff1f;平台战略投资。和的NFT似乎通过在空间分布存储的需求驱动。此字段主要资本市场。但事实上&#xff0c;分布式存储的发展一样快&#xff0c;空间和…

BSE分布式存储与流媒体平台宣布合作,引进一千万美金战略投资

近期&#xff0c;DP流媒体平台与BSE分布式存储宣布合作&#xff0c;战略投资一千万美金用于双方共同搭建为NFT作品提供更安全、更友好的存储平台。继元宇宙和NFT爆火之后&#xff0c;分布式存储的需求也似乎被带动了起来&#xff0c;该领域也陆续得到了资本市场的青睐&#xff…

压力传感器PFPL203 3BSE055365R1 NPI-15J-C00903 GE/Nova70M P7620C0042A A1004 A1020 C0040 C0042B LPE9400

ABB缸压传感器PFPL203&#xff0c;柴油机气缸压力监测ABB Cylmate系统是对发动机运行状态进行连续监测和分析的综合系 统。v18 0 3 0 18 30 32对气缸压力和曲轴位置的测量&#xff0c;结合ABB先进的数学建模&#xff0c;为用户 提供发动机实时准确的数据。 PFPL203压力传感器&…

mysql bse_Mysql基础语法-DDL

一、数据库级操作1、登录数据库&#xff1a;mysql -uroot -p登录说明&#xff1a;1)mysql表示客户端命令&#xff0c;“-u”后面紧跟着要连接的数据库名称&#xff0c;“-p”表示需要输入密码2)命令的结束符用“;”&#xff0c;或者“\g”表示客户端的连接id&#xff0c;记录了…

ABB机器人伺服驱动器IRC5 3HAC14551-3 LDGRB-01 3BSE013177R1 3BSE013175R1 DS200NATOG2A 5SHY35L4520 5SXE10-0181

ABB机器人伺服驱动器 随着机器人频繁的使用以及时间的积累&#xff0c;不免会出现设备的耗损和破坏&#xff0c;导致ABB机器人不能正常运作&#xff0c;ABB机器人驱动模块常见故障 包括&#xff1a; 34311 驱动变流器饱和警告 34312 缺失驱动装置 34313 错误的驱动单元类型…

ABB控制器PM866AK02、PM866K01、PM864AK01 3BSE018161R1、AC800M 3BSE053240R1 PM891、PM861K01 3BSE018105R1

W;1 8 0 3 01 7 7 7 5 9 ABB控制器PM866AK02、PM866K01、PM864AK01 3BSE018161R1、AC800M 3BSE053240R1 PM891、PM861K01 3BSE018105R1ABB控制器PM866AK02、PM866K01、PM864AK01 3BSE018161R1、AC800M 3BSE053240R1 PM891、PM861K01 3BSE018105R1ABB控制器PM866AK02、PM866K01…

通讯模块 CI854AK01 3BSE030220R1

通讯模块 CI854AK01 3BSE030220R1 通讯模块 CI854AK01 3BSE030220R1 GE QPI-GEG-201-H GE 369B1844G5004 GE IC695ACC412 GE IS200IGPAG2AED GE IS210MVRAH1A GE IS220PVIBH1AD GE IS220PDIAH1AD IS220PDIAH1A GE …

ABB RF533 3BSE014227R1、PM511V16 3BSE011181R1、REF615E_E HBFEAEAGABCCANC11E、UNITROL 1020 UNS0119A-Z,V1

W;1 8 0 3 01 77 75 9 ABB RF533 3BSE014227R1、PM511V16 3BSE011181R1、REF615E_E HBFEAEAGABCCANC11E、UNITROL 1020 UNS0119A-Z,V1 3BHE030579R0003/CI570 3BSE001440R1/PP865A 3BSE042236R2/PM511V08 3BSE011180R1/SPHSS03/PPD512A10-150000 3BHE040375R1023/3ASC25H219B…

ABB PP886H 3BSE069297R1、PP885 3BSE069276R1、PP881 3BSE092978R1、PP877 3BSE069272R2、PP875 3BSE092977R1

W;1 8 0 3 01 7 7 7 59 ABB PP886H 3BSE069297R1、PP885 3BSE069276R1、PP881 3BSE092978R1、PP877 3BSE069272R2、PP875 3BSE092977R1、PP865A、PP865 3BSE042236R1、PP836A、PP846A 3BSE042238R2、PP836A、PP836 3BSE042237R1、PP836、800PP846AABB PP886H 3BSE069297R1、P…

用VASP计算GW+BSE

VASP在5.3以后的版本都能用解BSE方程的方法&#xff0c;在计算光吸收的过程中考虑激子效应。 下面就来写一个用BSE计算bulkSi的例子 首先&#xff0c;介电函数的计算是在GW计算的基础之上的。这里首先介绍G0W0的计算&#xff08;我们这里直接在PBE的波函数基础上进行G0W0计算…

BSE---The Berkeley Segmentation Engine (BSE)

这是一个UCB做分割做的结果比较早、比较好的分割方法&#xff0c;其工程网站为&#xff1a;http://www.cs.berkeley.edu/~fowlkes/BSE/上面有代码及一些简单的介绍&#xff0c;此代码基于以下三篇文章&#xff1a;&#xff08;1&#xff09;&#xff1a; C. Fowlkes, J. Malik.…

23种设计模式(七)——桥接模式【单一职责】

文章目录 意图什么时候使用桥接真实世界类比桥接模式的实现桥接模式的优缺点亦称:Bridge 意图 桥接模式是将抽象部分与实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 什么时候使用桥接 1、如果一个…

2022中国科学院期刊分区表 | 经济学大类 | 升级版 | 期刊超越指数

2022年12月21日&#xff0c;中国科学院文献情报中心正式发布基于超越指数构建的期刊分区表——《中国科学院文献情报中心期刊分区表(升级版)》&#xff0c;此次对自科版(SCIE)和社科版(SSCI)期刊引证报告(JCR)中全部期刊进行分区。以下为经济学大类四个分区的详细期刊目录&…

经济学和计算机类大学排名,经济学专业世界大学排名ARWU

《经济学专业世界大学排名》点评2011年《经济学专业世界大学排名》在全球共评出100所大学&#xff0c;美国大学占据70所&#xff0c;并且前17名中美国大学占据了16所。亚洲仅有4所大学上榜&#xff0c;排名最靠前的是“香港科技大学”&#xff0c;位列45名&#xff0c;其他依次…

应用计量经济学与R(一)

我们相信R在计量经济学中有巨大的潜力&#xff0c;至少有三个原因&#xff1a; R 基本上是独立于操作系统平台的&#xff0c;兼容性非常强&#xff0c;可以在 Windows、Mac系列操作系统和各种风格的 Unix/Linux上&#xff0c;也适用于一些更奇特的操作系统平台。R 是一款免费软…

算力服务亟待破局,超聚变向新而行

“超聚变已独立活下来。”超聚变产品线总裁范瑞琦在2023新品发布会上透露。自从一年多前从华为体系独立&#xff0c;超聚变公司的未来就颇受业界关注。一方面&#xff0c;算力产业蒸蒸日上&#xff0c;各方尤为关注超聚变的产业定位以及发展算力产业的着力点&#xff1b;另一方…