CN109284098A - 基于RxJava构建事件总线RxBus的方法 - Google Patents
基于RxJava构建事件总线RxBus的方法 Download PDFInfo
- Publication number
- CN109284098A CN109284098A CN201811115266.5A CN201811115266A CN109284098A CN 109284098 A CN109284098 A CN 109284098A CN 201811115266 A CN201811115266 A CN 201811115266A CN 109284098 A CN109284098 A CN 109284098A
- Authority
- CN
- China
- Prior art keywords
- class
- rxbus
- event
- parameter
- publication
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及软件开发领域,克服EventBus方法实现事件的通知和订阅时难以测试追踪且不能进行代码混淆问题,提出一种基于RxJava构建事件总线RxBus的方法,包括定义事件总线类,记该事件总线类为RxBus类,RxBus类里定义了生成RxBus类的实例方法、主题映射对象、注册方法、注销方法和发布事件方法;生成RxBus类的实例方法用于以单例模式生成RxBus类的实例;注册方法用于创建主题对象,建立主题对象与传入的类标志参数的联系,返回Observable对象;注销方法用于注销相关的主题对象;发布事件方法用于发布以类标志参数相对应的主题来发布内容。本发明适用于RxJava框架中事件的订阅和发布。
Description
技术领域
本发明涉及软件开发领域,特别涉及一种基于RxJava构建事件总线RxBus的方法。
背景技术
2012年Netflix为了满足他们庞大的用户群体决定重新设计架构来减少REST服务接口调用次数,取代几十次的REST服务接口的调用,让客户端自己处理需要的数据,他们决定基于客户端需求创建一个专门优化过的REST服务接口的调用。为实现该目标,他们决定尝试响应式,将.NET Rx迁移到JVM上,由此RxJava诞生,RxJava是一个在JVM上实用可观测的出列来组成异步的基于事件的程序的库,采用的是响应式编程框架和观察者设计模式。现有的事件的通知和订阅采用的是EventBus来实现,该实现方法的代码阅读性较低、难以测试追踪且不能进行代码混淆。
发明内容
本发明所要解决的技术问题是:克服EventBus方法实现事件的通知和订阅时难以测试追踪且不能进行代码混淆问题,提出一种基于RxJava构建事件总线RxBus的方法。
本发明解决上述技术问题,采用的技术方案是:
基于RxJava构建事件总线RxBus的方法,包括定义事件总线类,记为RxBus类,RxBus类里定义了主题映射对象、生成RxBus类的实例方法、注册方法、反注册方法和发布事件方法;
所述生成RxBus类的实例方法用于以单例模式生成RxBus类的实例;
所述主题映射对象为“ConcurrentHashMap<Object,List<Subject>>”类型的对象,记为subjectMapper;
所述注册方法包括:将所述注册方法的形式参数中的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表;若所述数组列表为空,则创建该数组列表,并将传入的类标志参数和数组列表存入subjectMapper;创建新的PublishSubject对象并将其转换为SerializedSubject对象,将SerializedSubject对象加入数组列表,返回该SerializedSubject对象并将其转换为Observable对象;
所述反注册方法包括:将所述反注册方法的形式参数中的Object类型的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,如果该数组列表不为空,则所述数组列表移除所述反注册方法的形式参数中的Observable类型的对象,否则,移除subjectMapper中与传入的类标志参数对应的List<Subject>;
所述发布事件方法包括:将所述发布事件方法的形式参数中的类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,将所述数组列表内所有Subject对象依次触发onNext方法来发布事件,并将所述发布事件方法的形式参数中的Object类型的发布内容作为onNext方法的参数。
进一步的,订阅事件时,采用RxBus类的单例实例调用RxBus的注册方法,在该注册方法中传入需要被订阅的Object类型的类标志参数,获取返回的Observable对象进行事件的订阅。
进一步的,还包括在onError方法和onCompleted方法的方法体中重新订阅事件。
进一步的,发布事件时,采用RxBus类的单例实例调用发布事件方法,在该发布事件方法中传入需要发布的object类型的类标志参数和对应的发布内容。
进一步的,注销RxBus类时,在onDestroy方法中调用RxBus注销方法。
本发明的有益效果是:
通过生成RxBus类的实例方法、注册方法、注销方法和发布事件方法简化了组件之间的通信方式,调用RxBus类的方法可实现订阅和发布事件,在得到订阅的事件后可指定事件处理方法的执行线程,事件的创建和分发由RxBus管理,工作在一个单独的线程,实现了代码的解耦,使得业务代码更为简洁,少开发中的重复代码,开发者更专注业务模块的开发,缩小了开发成本的同时,使得代码容易测试和追踪,且由于Rxbus类是基于RxJava框架进行,其必然具有RxJava框架能进行代码混淆的功能。
附图说明
图1为本发明实施例的方法流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和实施例对本发明进行进一步详细说明。
基于RxJava构建事件总线RxBus的方法,包括定义事件总线类,记为RxBus类,RxBus类里定义了主题映射对象、生成RxBus类的实例方法、注册方法、注销方法和发布事件方法;其中,
所述生成RxBus类的实例方法用于以单例模式生成RxBus类的实例;
考虑到RxBus单例存在多线程并发访问,所述主题映射对象为“ConcurrentHashMap<Object,List<Subject>>”类型的对象,记为subjectMapper;将事件总线采用ConcurrentHashMap进行存储,使其在线程安全的基础上提供了更好的写并发能力,同时降低了对读一致性的要求。
所述注册方法传入的参数包括Object类型的类标志参数,在所述注册方法的方法体中将所述类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表;若所述数组列表为空,则创建该数组列表,并将传入的类标志参数和数组列表存入subjectMapper;创建新的PublishSubject对象(主题对象),PublishSubject对象同时充当了Observer对象和Observable对象的角色,由于PublishSubjec对象是非线程安全的,要避免该问题,需要将PublishSubjec对象转换为SerializedSubject对象,将SerializedSubject对象加入数组列表,返回该SerializedSubject对象并将其转换为Observable对象;所述注销方法传入的参数包括Object类型的类标志参数及Observable类型的对象,在所述注销方法的方法体中将所述类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,如果该数组列表不为空,则所述数组列表移除传入的Observable类型的对象,否则,移除subjectMapper中与传入的类标志参数对应的List<Subject>;
所述发布事件方法传入的参数包括需要发布的Object类型的类标志参数和发布内容,在所述发布事件方法中将传入的类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,将所述数组列表内所有Subject对象依次触发onNext方法来发布事件。
订阅事件时,采用RxBus类的单例实例调用RxBus的注册方法,在该注册方法中传入需要被订阅的Object类型的类标志参数,获取返回的Observable对象进行事件的订阅,在这之后,一旦SerializedSubjectt对象接收到事件,立即发送给订阅者;
onError方法代表事件队列异常,在事件处理过程中出现异常时,onError触发,同时事件队列自动终止不允许再有事件发生;onCompleted方法则代表事件队列完结,当不会再有新的onNext方法发出时,需要触发onCompleted方法作为标志。RxJava的事件序列机制中,一个订阅事件是以onCompleted方法或者onError方法作为结束的,也就是说一旦订阅者的onCompleted或onError被调用,订阅者和被订阅者的订阅关系就解除了,因此再也收不到后续发出的事件;为了解决上述问题,本发明还包括在onError方法和onCompleted方法的方法体中重新订阅事件,保证订阅事件在异常解决后可以立即恢复。
发布事件时,采用RxBus类的单例实例调用发布事件方法,在发布事件方法中传入参数包括需要发布的object类型的类标志参数和对应的发布内容,将事件发送给SerializedSubject对象,此时SerializedSubject对象作为Observer对象通过onNext方法接收到事件,然后会发射给所有订阅了该SerializedSubject对象的订阅者。
为了防止内存泄漏一,需要在onDestroy方法中调用RxBus注销方法来注销类。
实施例
如图1所示,基于RxJava构建事件总线RxBus的方法,包括定义事件总线类,记为RxBus类,RxBus类里定义了主题映射对象、生成RxBus类的实例方法、注册方法、反注册方法和发布事件方法;
所述生成RxBus类的实例方法用于以单例模式生成RxBus类的实例;
所述主题映射对象为ConcurrentHashMap<Object,List<Subject>>类型的对象,记为subjectMapper;
所述注册方法包括:将所述注册方法的形式参数中的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表;若所述数组列表为空,则创建该数组列表,并将传入的类标志参数和数组列表存入subjectMapper;创建新的PublishSubject对象并将其转换为SerializedSubject对象,将SerializedSubject对象加入数组列表,返回该SerializedSubject对象并将其转换为Observable对象,其中加入的方法可采用add方法。
所述反注册方法包括:将所述反注册方法的形式参数中的Object类型的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,如果该数组列表不为空,则所述数组列表移除所述反注册方法的形式参数中的Observable类型的对象,否则,移除subjectMapper中与传入的类标志参数对应的List<Subject>;其中,移除可采用remove方法。
所述发布事件方法包括:将所述发布事件方法的形式参数中的类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,将所述数组列表内所有Subject对象依次触发onNext方法来发布事件,并将所述发布事件方法的形式参数中的Object类型的发布内容作为onNext方法的参数。
订阅事件时,采用RxBus类的单例实例调用RxBus的注册方法,在该注册方法中传入需要被订阅的Object类型的类标志参数,获取返回的Observable对象进行事件的订阅,且在onError方法和onCompleted方法的方法体中重新订阅事件。
发布事件时,采用RxBus类的单例实例调用发布事件方法,在该发布事件方法中传入需要发布的object类型的类标志参数和对应的发布内容。
注销RxBus类时,在onDestroy方法中调用RxBus注销方法。
Claims (5)
1.基于RxJava构建事件总线RxBus的方法,其特征在于,包括定义事件总线类,记为RxBus类,RxBus类里定义了主题映射对象、生成RxBus类的实例方法、注册方法、反注册方法和发布事件方法;
所述生成RxBus类的实例方法用于以单例模式生成RxBus类的实例;
所述主题映射对象为“ConcurrentHashMap<Object,List<Subject>>”类型的对象,记为subjectMapper;
所述注册方法包括:将所述注册方法的形式参数中的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表;若所述数组列表为空,则创建该数组列表,并将传入的类标志参数和数组列表存入subjectMapper;创建新的PublishSubject对象并将其转换为SerializedSubject对象,将SerializedSubject对象加入数组列表,返回该SerializedSubject对象并将其转换为Observable对象;
所述反注册方法包括:将所述反注册方法的形式参数中的Object类型的类标志作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,如果该数组列表不为空,则所述数组列表移除所述反注册方法的形式参数中的Observable类型的对象,否则,移除subjectMapper中与传入的类标志参数对应的List<Subject>;
所述发布事件方法包括:将所述发布事件方法的形式参数中的类标志参数作为参数来调用subjectMapper的get方法获得对应的List<Subject>类型的数组列表,将所述数组列表内所有Subject对象依次触发onNext方法来发布事件,并将所述发布事件方法的形式参数中的Object类型的发布内容作为onNext方法的参数。
2.如权利要求1所述的基于RxJava构建事件总线RxBus的方法,其特征在于,订阅事件时,采用RxBus类的单例实例调用RxBus的注册方法,在该注册方法中传入需要被订阅的Object类型的类标志参数,获取返回的Observable对象进行事件的订阅。
3.如权利要求1所述的基于RxJava构建事件总线RxBus的方法,其特征在于,还包括在onError方法和onCompleted方法的方法体中重新订阅事件。
4.如权利要求1或2或3所述的基于RxJava构建事件总线RxBus的方法,其特征在于,发布事件时,采用RxBus类的单例实例调用发布事件方法,在该发布事件方法中传入需要发布的object类型的类标志参数和对应的发布内容。
5.如权利要求1所述的基于RxJava构建事件总线RxBus的方法,其特征在于,反注册RxBus类时,在onDestroy方法中调用RxBus反注册方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811115266.5A CN109284098A (zh) | 2018-09-25 | 2018-09-25 | 基于RxJava构建事件总线RxBus的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811115266.5A CN109284098A (zh) | 2018-09-25 | 2018-09-25 | 基于RxJava构建事件总线RxBus的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109284098A true CN109284098A (zh) | 2019-01-29 |
Family
ID=65181864
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811115266.5A Pending CN109284098A (zh) | 2018-09-25 | 2018-09-25 | 基于RxJava构建事件总线RxBus的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109284098A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114741063A (zh) * | 2022-04-06 | 2022-07-12 | 山东赤子城网络技术有限公司 | 一种基于Lua语言的编程框架实现方法及系统 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012097423A1 (en) * | 2011-01-18 | 2012-07-26 | Caterina Papachristos | Business to business to shared communities system and method |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN104778042A (zh) * | 2015-03-30 | 2015-07-15 | 江苏省邮电规划设计院有限责任公司 | 一种基于事件流处理和插件式开发框架的流数据处理方法 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
CN107085532A (zh) * | 2017-03-21 | 2017-08-22 | 东软集团股份有限公司 | 任务监听方法和装置 |
CN107544852A (zh) * | 2016-11-29 | 2018-01-05 | 腾讯科技(深圳)有限公司 | 页面信息显示方法和装置 |
-
2018
- 2018-09-25 CN CN201811115266.5A patent/CN109284098A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012097423A1 (en) * | 2011-01-18 | 2012-07-26 | Caterina Papachristos | Business to business to shared communities system and method |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN104778042A (zh) * | 2015-03-30 | 2015-07-15 | 江苏省邮电规划设计院有限责任公司 | 一种基于事件流处理和插件式开发框架的流数据处理方法 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
CN107544852A (zh) * | 2016-11-29 | 2018-01-05 | 腾讯科技(深圳)有限公司 | 页面信息显示方法和装置 |
CN107085532A (zh) * | 2017-03-21 | 2017-08-22 | 东软集团股份有限公司 | 任务监听方法和装置 |
Non-Patent Citations (1)
Title |
---|
天天_BYCONAN: "[Android]基于RxJava、RxAndroid的EventBus实现", 《HTTP://WWW.CNBLOGS.COM/TIANTIANBYCONAN/P/4578699.HTML》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114741063A (zh) * | 2022-04-06 | 2022-07-12 | 山东赤子城网络技术有限公司 | 一种基于Lua语言的编程框架实现方法及系统 |
CN114741063B (zh) * | 2022-04-06 | 2023-08-22 | 山东赤子城网络技术有限公司 | 一种基于Lua语言的编程框架实现方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107493310B (zh) | 一种云资源处理方法及云管理平台 | |
CN109040152B (zh) | 一种基于服务编排的服务请求和提供方法、装置以及电子设备 | |
CN109002362A (zh) | 一种服务方法、装置、系统以及电子设备 | |
CN104899046B (zh) | 一种多功能脚本运行方法和系统 | |
CN110018962A (zh) | 基于分布式服务框架和注册中心的服务调试方法及系统 | |
WO2014206289A1 (en) | Method and apparatus for outputting log information | |
CN102810184A (zh) | 一种动态执行工作流的方法、装置及企业系统 | |
CN107479981B (zh) | 一种基于异步调用实现同步调用的处理方法及装置 | |
US20150067013A1 (en) | Methods for servicing web service requests using parallel agile web services and devices thereof | |
CN109542642A (zh) | 一种前端任务处理的方法及装置 | |
TW201015440A (en) | Lock windows for reducing contention | |
CN108664521B (zh) | 一种提供序列号的方法、装置、电子设备和可读存储介质 | |
CN107295082A (zh) | 软件运行处理方法、装置及系统 | |
CN109960589A (zh) | 嵌入式系统的系统软件层的实现方法、装置及可读介质 | |
CN109471626A (zh) | 页面逻辑结构、页面生成方法、页面数据处理方法及装置 | |
CN105867944A (zh) | Web前端数据操作层及其实现方法 | |
CN110610376A (zh) | 行为数据的响应方法、装置、计算机设备及存储介质 | |
CN106250229A (zh) | 事件处理的方法及装置 | |
CN109284098A (zh) | 基于RxJava构建事件总线RxBus的方法 | |
CN107368498A (zh) | 优化MySQL悲观锁的锁等待超时时间的方法及装置 | |
CN109710679A (zh) | 数据抽取方法及装置 | |
CN104731564A (zh) | 系统接口调用记录的生成方法和装置 | |
CN110162395A (zh) | 一种内存分配的方法及装置 | |
WO2015112612A1 (en) | System and method for implementing screen capture | |
CN109460193B (zh) | 一种存储系统中io处理方法、装置及终端 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190129 |