Android Studio:RxBus结合ICompositeSubscription使用
我现在想用 RxBus 来发布和订阅事件,同时使用 ICompositeSubscription 来管理订阅。跟前一个博客的区别在于,事件流的产生方式不同,更加得全面。
目标
- 使用
RxBus发布事件。 - 使用
ICompositeSubscription来管理订阅。 - 在
Activity中创建订阅,并确保在Activity销毁时取消订阅,避免内存泄漏。
代码实现
1、RxBus:发布和订阅事件。
public class RxBus {private final SerializedSubject<Object, Object> subject;public RxBus() {subject = new SerializedSubject<>(PublishSubject.create());}public void post(Object object) {subject.onNext(object); // 发布事件}@NonNullpublic <T> Observable<T> toObservable(Class<T> type) {return subject.ofType(type); // 转换成指定类型的 Observable}public <T> Subscription toSubscription(Class<T> type, Action1<T> action1, Scheduler scheduler) {return this.toObservable(type).subscribeOn(scheduler) // 指定线程调度器.subscribe(action1);}
}
2、 ICompositeSubscription:管理订阅。
public class ICompositeSubscription {private CompositeSubscription mCompositeSubscription;public ICompositeSubscription() {mCompositeSubscription = new CompositeSubscription();}public Subscription putSubscription(Subscription subscription) {mCompositeSubscription.add(subscription); // 添加订阅return subscription;}public void unSubscribe() {if (mCompositeSubscription != null) {mCompositeSubscription.clear(); // 取消所有订阅}}
}
3、Event 类:定义事件类。
public class Event {private String message;public Event(String message) {this.message = message;}public String getMessage() {return message;}
}
4、Activity 代码:在 Activity 中,使用 RxBus 发布和订阅事件,并使用 ICompositeSubscription 来管理订阅。
public class MyActivity extends AppCompatActivity {private ICompositeSubscription subscriptionManager = new ICompositeSubscription();private RxBus mRxBus;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRxBus = new RxBus(); // 初始化 RxBus// 设置订阅事件的规则Subscription subscription = mRxBus.toObservable(Event.class) // 订阅 Event 类型的事件.observeOn(AndroidSchedulers.mainThread()) // 在主线程处理.subscribe(event -> {Log.d("RxJava", "收到事件:" + event.getMessage());});// 管理订阅subscriptionManager.putSubscription(subscription);// 模拟发布事件findViewById(R.id.btnSendEvent).setOnClickListener(view -> {// 发布一个 Event 类型的事件mRxBus.post(new Event("Hello from RxBus!"));});}@Overrideprotected void onDestroy() {super.onDestroy();// 取消所有订阅,避免内存泄漏subscriptionManager.unSubscribe();}
}
代码解释
-
RxBus类:- 用于发布和订阅事件。通过
post()方法发布事件,使用toObservable()将事件转换为Observable,让订阅者可以订阅该事件。
- 用于发布和订阅事件。通过
-
ICompositeSubscription类:- 用于管理多个订阅。在
onCreate()中,订阅事件后将订阅对象加入到CompositeSubscription中,确保在onDestroy()时可以统一取消所有订阅,避免内存泄漏。
- 用于管理多个订阅。在
-
Event类:- 简单的事件类,包含一个
message字段和构造方法,用于传递事件数据。
- 简单的事件类,包含一个
-
MyActivity:- 在
onCreate()中初始化RxBus和ICompositeSubscription,并订阅Event类型的事件。 btnSendEvent按钮点击后,调用RxBus.post()发布一个事件。- 在
onDestroy()中调用subscriptionManager.unSubscribe()来取消订阅。
- 在
重要概念
-
RxBus的发布和订阅:RxBus是一个事件总线,通过toObservable()和post()方法实现发布和订阅事件。- 订阅
RxBus后,每当有事件发布时,订阅者会接收到这个事件,并做出响应。
-
ICompositeSubscription的作用:ICompositeSubscription管理多个订阅,当Activity销毁时,调用unSubscribe()取消所有订阅,防止内存泄漏。- 在
Activity中添加每个新的订阅并通过putSubscription()方法管理。
相关文章:
Android Studio:RxBus结合ICompositeSubscription使用
我现在想用 RxBus 来发布和订阅事件,同时使用 ICompositeSubscription 来管理订阅。跟前一个博客的区别在于,事件流的产生方式不同,更加得全面。 目标 使用 RxBus 发布事件。使用 ICompositeSubscription 来管理订阅。在 Activity 中创建订…...
微软AutoGen高级功能——Magentic-One
介绍 大家好,博主又来给大家分享知识了,这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢,我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统,用于…...
redis cluster测试
集群节点信息这时候停掉一个master 172.30.60.31 从集群信息集中我们可以看到172.30.60.31的slave是172.30.60.41,查看41的日志,发现他成为了新的master 这时候我们在将172.30.60.41也杀死,会发现集群异常了 尝试把172.30.60.31启动ÿ…...
【ARM】JTAG接口介绍
1、 文档目标 对 JTAG 接口有更多的认识,在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时,免不了要接触到 JTAG 接口,当出现连接不上时,就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…...
处理项目中存在多个版本的jsqlparser依赖
异常提示 Correct the classpath of your application so that it contains a single, compatible version of net.sf.jsqlparser.statement.select.SelectExpressionIte实际问题 原因:项目中同时使用了 mybatis-plus 和 pagehelper,两者都用到了 jsqlpa…...
部署 DeepSeek R1各个版本所需硬件配置清单
DeepSeek-R1 通过其卓越的推理性能和灵活的训练机制,在 2025 年的春节期间受到了广泛关注。 DeepSeek-R1 是一款高性能的 AI 推理模型,主要通过强化学习技术来增强模型在复杂任务场景下的推理能力。 在本地部署 DeepSeek-R1 时,尤其是完整的…...
数据结构:Map Set(一)
目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 (1)纯key模型 (2)Key-Value模型 三、Map的使用 1、什么是Map? 2、Map的常用方法 (1)V put(K …...
zabbix 监控系统 配置钉钉告警
步骤1:创建钉钉群 步骤2:创建机器人 点击群设置 然后下划选择机器人。 点击添加机器人 选择自定义机器人 点击添加 1、设置机器人的名字和群组 2、设置自定义关键字 zabbix 告警 报警 恢复 3、点击我已阅读并同意 4、点击完成 生成webhook 链接 注…...
跟着李沐老师学习深度学习(十一)
经典的卷积神经网络 在本次笔记中主要介绍一些经典的卷积神经网络模型,主要包含以下: LeNet:最早发布的卷积神经网络之一,目的是识别图像中的手写数字;AlexNet: 是第一个在大规模视觉竞赛中击败传统计算机…...
32单片机学习记录4之串口通信
32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式,复用模式,模拟模式三种,加上输入输出就是有6中对应的模式。 我学习了通用模式,会使用GPIO口使用一些简单外设,如LED,独立按键,红外…...
微信小程序 - 组件和样式
组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...
JavaScript 发起网络请求 axios、fetch、async / await
目录 fetch 发送 GET 请求(fetch) 发送 POST 请求(fetch) 处理后台异常响应 async / await async await 发送 GET 请求(async / await fetch) 发送 POST 请求(async / await fetch&…...
本地搭建自己的专属客服之OneApi关联Ollama部署的大模型并创建令牌《下》
这里写目录标题 OneApi1、渠道设置2、令牌创建 配置文件修改修改配置文件docker-compose.yml修改config.json到此结束 上文讲了如何本地docker部署fastGtp,相信大家也都已经部署成功了!!! 今天就说说怎么让他们连接在一起 创建你的…...
Win10环境借助DockerDesktop部署最新MySQL9.2
Win10环境借助DockerDesktop部署最新MySQL9.2 前言 作为一杆主要撸Java的大数据平台开发攻城狮,必不可少要折腾各种组件,环境和版本一直是很头疼的事情。虽然可以借助Anaconda来托管Python的环境,也可以使用多个虚拟机来部署不同的环境&…...
【Maven】多module项目优雅的实现pom依赖管理
【Maven】多module项目优雅的实现pom依赖管理 【一】方案设计原则【二】项目结构示例【三】实现思路【1】可能的问题点:【2】解决方案的思路:【3】需要注意的地方:【4】可能的错误: 【四】实现案例【1】父POM设计(pare…...
前端vue引入特殊字体不生效
引入特殊字体ttf,TTF等发现开发环境中生效,项目部署后不生效何解? 1. 本地生效的原因 本地使用的是本地的资源,控制台可以看到对ttf文件的请求与加载。 2.部署后不生效的原因与解决 控制台可以看到对ttf资源文件的请求加载失败…...
【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 🏠 yum 🎸 什么是yum 当用户想下载软…...
WEB安全--SQL注入--INTO OUTFILE
一、INTO OUTFILE 函数语法: SELECT column1, column2, INTO OUTFILE file_path FROM your_table WHERE your_conditions; 使用此方式在SQL注入的过程中可以: 1、上传shell得到数据库的后端的操作权限 2、爆出数据库的信息 二、使用该函数的条件&#…...
如何从0开始将vscode源码编译、运行、打包桌面APP
** 网上关于此的内容很少,今天第二次的完整运行了,按照下文的顺序走不会出什么问题。最重要的就是环境的安装,否则极其容易报错,请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步:克隆 VSCode 源码 首先…...
关于视频去水印的一点尝试
一. 视频去水印的几种方法 1. 使用ffmpeg delogo滤镜 delogo 滤镜的原理是通过插值算法,用水印周围的像素填充水印的位置。 示例: ffmpeg -i input.mp4 -filter_complex "[0:v]delogox420:y920:w1070:h60" output.mp4 该命令表示通过滤镜…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
