Kotlin实现RxBus3
1、添加依赖
implementation "io.reactivex.rxjava3:rxjava:3.1.2"implementation "io.reactivex.rxjava3:rxandroid:3.0.0"
2、RxBus3.kt
class RxBus3 private constructor(){private val subjectMapper = ConcurrentHashMap<Any, MutableList<Subject<Any>>>()private val subscriber = ConcurrentHashMap<Any, ConcurrentHashMap<Any, Observable<*>>>()private val subscriptionMapper = ConcurrentHashMap<Any, MutableList<Disposable>>()companion object {val instance : RxBus3 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {RxBus3()}}private fun isEmpty(collection: Collection<Subject<*>?>?): Boolean {return null == collection || collection.isEmpty()}fun register(@NonNull tag: Any, @NonNull consumer: Consumer<Any>, clazz: Class<*>): Observable<Any> {var subjectList = subjectMapper[tag]if (null == subjectList) {subjectList = ArrayList()subjectMapper[tag] = subjectList}val subject: Subject<Any>subject = PublishSubject.create()subjectList.add(subject)val sub = subject.observeOn(AndroidSchedulers.mainThread()).subscribe(consumer) { obj: Throwable -> obj.printStackTrace() }var subList: MutableList<Disposable>? = subscriptionMapper[clazz]if (null == subList) {subList = ArrayList()}subList.add(sub)subscriptionMapper[clazz] = subListvar subMap: ConcurrentHashMap<Any, Observable<*>>? = subscriber[clazz]if (subMap == null) {subMap = ConcurrentHashMap()}subMap[tag] = subjectsubscriber[clazz] = subMapreturn subject}fun unregister(clazz: Class<*>) {unsubscribe(clazz)val sub: ConcurrentHashMap<Any, Observable<*>>? = subscriber[clazz]if (sub != null) {for (tag in sub.keys) {val value = sub[tag]if (null != value) {unregister(tag)}}}}private fun unsubscribe(clazz: Class<*>) {val sub = subscriptionMapper.remove(clazz)if (sub != null && sub.isNotEmpty()) {val it = sub.listIterator()while (it.hasNext()) {val subscriptDispose = it.next()subscriptDispose.dispose()it.remove()}}}private fun unregister(@NonNull tag: Any) {subjectMapper[tag]?.remove(tag)}fun post(@NonNull tag: Any, @NonNull content: Any) {val subjectList = subjectMapper[tag]if (!isEmpty(subjectList)) {if (subjectList != null) {for (subject in subjectList) {subject.onNext(content)}}}}
}
3、使用
// 1、根据tag发送事件
RxBus3.instance.post("tag_any_string", "content_xxx")
RxBus3.instance.post("tag_any_object", obj)
....//2、注册tag事件源,并指定class
RxBus3.instance.register("tag_any_object", {obj -> run { println(obj) }}, javaClass)//3、删除指定class里面的所有事件
RxBus3.instance.unregister(javaClass)
非常感谢你能看到最后,如果能够帮助到你,是我的荣幸!
Kotlin实现RxBus3相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- 在kotlin companion object中读取Bean,注入Bean对象
在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件. 使用组 ...
- 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置
在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...
- kotlin中继承父属性使用构造方法
kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库
示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...
- kotlin Bean加载失败lateinit property has not been initialized
Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...
最新文章
- 实现apply call 方法
- 人体关键点颜色和预处理
- python画海绵宝宝_脑洞大开的万圣节,10招带你和宝宝花式玩南瓜
- IDEA 启动报错could not find main class com/intellij/idea/main解决办法
- 仿minecraft游戏 linux,【图片】【Codea制作仿MineCraft3D游戏】Craft Ver. 0.1发布(开源)【codea吧】_百度贴吧...
- linux-mv移动更名-硬链接
- Node.js是什么?
- [转] js前端解决跨域问题的8种方案(最新最全)
- wireshark 分析过滤数据
- Linux中yum使用教程,linux中关于yum使用
- 知网下载文献格式caj/pdf
- 6款良心本地视频播放器,功能强大还完全免费
- Python代码对接抖音去水印提取API接口、TikTok去水印解析接口的源码
- 从1G说到5G:构造万物互联的社会
- cpu多开测试软件,游戏多开CPU优化工具
- Atlas:Ubuntu18.04使用过程中空间爆满的处理(.cache)
- 【论文】写毕业论文过程中遇到的问题及解决方式记录
- flutter,快速获取ios设备的udid
- CentOS7 快速搭建VNC Server 实现服务器远程控制台访问(Java Viewer)
- VScode开发PHP的必要插件
热门文章
- mxn的矩阵乘以自身转置的意义
- 鸟哥的Linux私房菜-第七章、Linux 磁盘与文件系统管理
- c++设计模式之单例模式
- 计算机机房管理现状,计算机机房管理中的问题及应对措施探讨.doc
- 3dmax 视图切换
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式
- mysql pxc 使用,配置mysql中的PXC服务
- 详解sd协议以及裸机和u-boot中的sd卡驱动(2)
- shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成
- Linux重签名工具程序及命令行重签ipa文档