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相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. 在kotlin companion object中读取Bean,注入Bean对象

    在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件.   使用组 ...

  3. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  4. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  5. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  6. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  7. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  8. Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库

    示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...

  9. kotlin Bean加载失败lateinit property has not been initialized

    Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...

最新文章

  1. 实现apply call 方法
  2. 人体关键点颜色和预处理
  3. python画海绵宝宝_脑洞大开的万圣节,10招带你和宝宝花式玩南瓜
  4. IDEA 启动报错could not find main class com/intellij/idea/main解决办法
  5. 仿minecraft游戏 linux,【图片】【Codea制作仿MineCraft3D游戏】Craft Ver. 0.1发布(开源)【codea吧】_百度贴吧...
  6. linux-mv移动更名-硬链接
  7. Node.js是什么?
  8. [转] js前端解决跨域问题的8种方案(最新最全)
  9. wireshark 分析过滤数据
  10. Linux中yum使用教程,linux中关于yum使用
  11. 知网下载文献格式caj/pdf
  12. 6款良心本地视频播放器,功能强大还完全免费
  13. Python代码对接抖音去水印提取API接口、TikTok去水印解析接口的源码
  14. 从1G说到5G:构造万物互联的社会
  15. cpu多开测试软件,游戏多开CPU优化工具
  16. Atlas:Ubuntu18.04使用过程中空间爆满的处理(.cache)
  17. 【论文】写毕业论文过程中遇到的问题及解决方式记录
  18. flutter,快速获取ios设备的udid
  19. CentOS7 快速搭建VNC Server 实现服务器远程控制台访问(Java Viewer)
  20. VScode开发PHP的必要插件

热门文章

  1. mxn的矩阵乘以自身转置的意义
  2. 鸟哥的Linux私房菜-第七章、Linux 磁盘与文件系统管理
  3. c++设计模式之单例模式
  4. 计算机机房管理现状,计算机机房管理中的问题及应对措施探讨.doc
  5. 3dmax 视图切换
  6. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式
  7. mysql pxc 使用,配置mysql中的PXC服务
  8. 详解sd协议以及裸机和u-boot中的sd卡驱动(2)
  9. shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成
  10. Linux重签名工具程序及命令行重签ipa文档