当前位置: 首页 > news >正文

【RxJava】map过程中各个Observable生命周期分析

map和flatMap的区别

首先说下map和flatMap的区别,防止有对RxJava还不够熟悉的小伙伴

  • map的Function指定如何将A转为B
  • flatMap的Function则指定如何将Observable<A>转为Observable<B>
  • map和flatMap最终的转换结果都是Observable<B>
  • flatMap由于可以自己创建Observable,因此更为强大灵活,map比较简单

Observable生命周期测试

下面,我们创建一个Observable,并通过map和flatMap进行多次Observable转换

分别在正常流程和异常流程下,测试map过程中各个Observable的生命周期执行流程

import io.reactivex.rxjava3.core.Observable;@SuppressWarnings("all")public class RxJavaMapTest {public static class Action {public static String A() {System.out.println("A Execute");return "A";}public static Observable<String> B() {System.out.println("B Execute");return Observable.just("B");}public static Observable<String> C() {System.out.println("C Execute");//throw new RuntimeException("Error");return Observable.just("C");}public static Observable<String> D() {System.out.println("D Execute");return Observable.just("D");}public static Observable<String> E() {System.out.println("E Execute");return Observable.just("E");}}public static void main(String[] args) {Observable.just("").map(o -> Action.A()).doOnSubscribe(aAction -> {System.out.println("doOnSubscribe A");}).doOnNext(o -> {System.out.println("doOnNext A1");}).doOnNext(o -> {System.out.println("doOnNext A2");}).doOnError(e -> {System.out.println("doOnError A");}).doOnComplete(() -> {System.out.println("doOnComplete A");}).doFinally(() -> {System.out.println("doOnFinally A");}).flatMap(o -> Action.B()).doOnSubscribe(aAction -> {System.out.println("doOnSubscribe B");}).doOnNext(o -> {System.out.println("doOnNext B");}).doOnError(e -> {System.out.println("doOnError B");}).doOnComplete(() -> {System.out.println("doOnComplete B");}).doFinally(() -> {System.out.println("doOnFinally B");}).flatMap(o -> Action.C()).doOnSubscribe(o -> {System.out.println("doOnSubscribe C");}).doOnNext(o -> {System.out.println("doOnNext C");}).doOnError(e -> {System.out.println("doOnError C");}).doOnComplete(() -> {System.out.println("doOnComplete C");}).doFinally(() -> {System.out.println("doOnFinally C");}).flatMap(o -> Action.D()).doOnSubscribe(o -> {System.out.println("doOnSubscribe D");}).doOnNext(o -> {System.out.println("doOnNext D");}).doOnError(e -> {System.out.println("doOnError D");}).doOnComplete(() -> {System.out.println("doOnComplete D");}).doFinally(() -> {System.out.println("doOnFinally D");}).flatMap(o -> Action.E()).doOnSubscribe(o -> {System.out.println("doOnSubscribe E");}).doOnNext(o -> {System.out.println("doOnNext E");}).doOnError(e -> {System.out.println("doOnError E");}).doOnComplete(() -> {System.out.println("doOnComplete E");}).doFinally(() -> {System.out.println("doOnFinally E");}).subscribe(o -> System.out.println("doOnFinally X"),e -> System.out.println("doOnError X"),() -> System.out.println("doOnFinally X"));System.out.println("Task Finish");}}

正常情况下的运行结果

doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnNext C
D Execute
doOnNext D
E Execute
doOnNext E
doOnFinally X
doOnComplete A
doOnComplete B
doOnComplete C
doOnComplete D
doOnComplete E
doOnFinally X
doOnFinally E
doOnFinally D
doOnFinally C
doOnFinally B
doOnFinally A
Task Finish

C发生异常时的运行结果

doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnFinally A
doOnFinally B
doOnError C
doOnFinally C
doOnError D
doOnFinally D
doOnError E
doOnError X
doOnFinally E
Task Finish

下面,我们基于以上两次运行结果进行分析

如果有其它更深层次的疑问,可以复制以上代码,自己调整继续运行

正常流程下的生命周期流程

  • ABCDEX依次执行onSubscribe
  • ABCDE依次执行Function和onNext
  • ABCDEX依次执行onComplete
  • XEDCBD依次执行onFinally

C发生异常时的生命周期流程

  • ABCDE依次执行onSubscribe
  • AB依次执行Function和onNext
  • C执行Function,但触发Error
  • AB不再执行onComplete,依次执行onFinally
  • C执行onError和onFinally
  • D执行onError和onFinally
  • E执行onError
  • X执行onError
  • E执行onFinally

流程分析

  • 执行subscribe方法之后,B订阅A,C订阅B。。。
  • 无异常时,onFinally是按EDCBD顺序执行的,说明Subscriber工作全部完成后,Observable才会执行onFinally
  • C触发Error后,AB都不执行onComplete,说明Subscriber处理时发生错误,Observable也会被视为工作未完成
  • C触发Error后,AB立刻执行onFinally,说明Subscriber发生异常时,Observable工作直接结束
  • C触发Error后,AB不执行onError,但DE会执行onError,说明Observable错误,会引发Subscriber错误

多次map过程中,异常处理方式可以总结为

  • 发生异常时,所有的OnSubscribe都会执行
  • 发生异常时,所有的OnFinally都会执行
  • 发生异常时,所有的OnComplete都不会执行
  • 发生异常时,后续的OnError都会执行
  • 发生异常时,后续的OnNext都不会执行
  • 发生异常时,后续的Function都不会执行

多次map过程中,Function的处理方式

  • 多次map实际上是依次订阅的关系,B订阅A,再将自己的结果发射给C
  • map方法只是创建了一个起到包装作用的Observable,将所有回调对象,和用于转换的Function保存了起来
  • Function并不会立即执行,而是等subscribe之后,等到上个Observable处理成功,才会执行

subscribe回调和doOn系列回调的区别

  • 效果一样,只是给Observable提供了不同的回调设置方式
  • subscribe回调是设置给最后一个Observable的,和前面代码没有任何关系,不要复杂化
  • 一个Observable可以有多个回调,它们都会生效,并不会相互覆盖,按设置先后顺序执行

相关文章:

【RxJava】map过程中各个Observable生命周期分析

map和flatMap的区别 首先说下map和flatMap的区别&#xff0c;防止有对RxJava还不够熟悉的小伙伴 map的Function指定如何将A转为BflatMap的Function则指定如何将Observable<A>转为Observable<B>map和flatMap最终的转换结果都是Observable<B>flatMap由于可以…...

vue 获取上一周和获取下一周的日期时间

效果图&#xff1a; 代码 <template><div><div style"padding: 20px 0;"><div style"margin-left: 10px; border-left: 5px solid #0079fe; font-size: 22px; font-weight: 600; padding-left: 10px">工作计划</div><di…...

线性代数 第四章 线性方程组

一、矩阵形式 经过初等行变换化为阶梯形矩阵。当&#xff0c;有解&#xff1b;当&#xff0c;有非零解。 有解&#xff0c;等价于 可由线性表示 克拉默法则&#xff1a;非齐次线性方程组中&#xff0c;系数行列式&#xff0c;则方程组有唯一解&#xff0c;且唯一解为 其中是…...

@DateTimeFormat和@JsonFormat注解

在日常开发中&#xff0c;有用到时间类型作为查询参数或者查询结果有时间参数的一般都会见过这两个注解。 DateTimeFormat(pattern “yyyy-MM-dd HH:mm:ss”)注解用于解析请求接口入参。将入参的字符串按照pattern设置的格式来转换成日期时间对象。 JsonFormat(timezone “G…...

做抖音短视频会经历哪些阶段?

今天来聊聊那些在抖音做大的老板&#xff0c;从开始到后期经历的四个阶段&#xff0c;以及每个阶段的工作重心 1、0—1的阶段 0—1的起步阶段是整个阶段最有难度的一环&#xff0c;很多人对0到1的认知是有错误的&#xff0c;以为爆过几条视频就已经进阶了 想要实现0-1的突破…...

【Mquant】2、量化平台的选择

文章目录 一、选择因素二、常见的量化平台三、为什么选择VeighNa&#xff1f;四、参考 一、选择因素 功能和工具集&#xff1a;量化平台应该提供丰富的功能和工具集&#xff0c;包括数据分析、策略回测、实时交易等。不同的平台可能有不同的特点和优势&#xff0c;可以根据自己…...

iPhone手机如何恢复删除的视频?整理了3个好用方法!

在日常生活中&#xff0c;我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴&#xff0c;每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办&#xff1f;如何恢复删除的视频&#xff1f;本文将以iPhone手机为例子&#xff0c;教…...

全网最全的RDMA拥塞控制入门基础教程

RDMA-CC&#xff08;全网最全的RDMA拥塞控制入门基础教程&#xff09; 文章目录 RDMA-CC&#xff08;全网最全的RDMA拥塞控制入门基础教程&#xff09;DMARDMARDMA举例RDMA优势RDMA的硬件实现方法RDMA基本术语FabricCA&#xff08;Channel Adapter&#xff09;Verbs 核心概念Me…...

分布式消息队列:RabbitMQ(1)

目录 一:中间件 二:分布式消息队列 2.1:是消息队列 2.1.1:消息队列的优势 2.1.1.1:异步处理化 2.1.1.2:削峰填谷 2.2:分布式消息队列 2.2.1:分布式消息队列的优势 2.2.1.1:数据的持久化 2.2.1.2:可扩展性 2.2.1.3:应用解耦 2.2.1.4:发送订阅 2.2.2:分布式消息队列…...

Redis集群脑裂

1. 概述 Redis 集群脑裂&#xff08;Cluster Split Brain&#xff09;是指在 Redis 集群中&#xff0c;由于网络分区或通信问题&#xff0c;导致集群中的节点无法相互通信&#xff0c;最终导致集群内部发生分裂&#xff0c;出现多个子集群&#xff0c;每个子集群认为自己是有效…...

GEE教程——随机样本点添加经纬度信息

简介: 有没有办法在绘制散点图后将样本的坐标信息(纬度/经度)添加到.CSV表格数据中? 这里我们很多时候我们需要加载样本点的基本信息作为属性,本教程主要的目的就是我们选取一个研究区,然后产生随机样本点,然后利用坐标函数,进行样本点的获取经纬度,然后通过循环注意…...

PyTorch入门学习(十):神经网络-非线性激活

目录 一、简介 二、常见的非线性激活函数 三、实现非线性激活函数 四、示例&#xff1a;应用非线性激活函数 一、简介 在神经网络中&#xff0c;激活函数的主要目的是引入非线性特性&#xff0c;从而使网络能够对非线性数据建模。如果只使用线性变换&#xff0c;那么整个神…...

《golang设计模式》第三部分·行为型模式-03-解释器模式(Interpreter)

文章目录 1. 概述1.1 角色1.2 类图1.3 优缺点 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 解释器模式&#xff08;Interpreter&#xff09;是用于表达语言语法树和封装语句解释&#xff08;或运算&#xff09;行为的对象。 1.1 角色 AbstractExpression&#xff08;抽象表…...

Windows个性化颜色睡眠后经常改变

问题再现 我把系统颜色换成了一种红色&#xff0c;结果每次再打开电脑又变回去了&#xff08;绿色&#xff09;&#xff1b; 原因是因为wallpaper engine在捣蛋 需要禁用修改windows配色这一块选项&#xff1b; 完事&#xff01;原来是wallpaper engine的问题&#xff1b;...

calico ipam使用

calico ipam使用 前面的文章pod获取ip地址的过程中提到过calico使用的IP地址的管理模块是其自己开发的模块calico-ipam,本篇文章来讲述下其具体用法。 一、环境信息 版本信息 本环境使用版本是k8s 1.25.3 [rootnode1 ~]# kubectl get node NAME STATUS ROLES …...

Redis系统学习(高级篇)-Redis持久化-AOF方式

目录 一、是什么AOF&#xff1f; 二、AOF如何开启 以及触发策略有哪些 三、AOF文件重写 四、AOF与RDB对比 一、是什么AOF&#xff1f; 就是通过每次记录写操作&#xff0c;最终通过来依次这些命令来达到恢复数据的目的 二、AOF如何开启 以及触发策略有哪些 save "&q…...

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…...

精选10款Python可视化工具,请查收

今天我们会介绍一下10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的。 1、matplotlib matplotlib 是Python可视化程序库的泰斗。经过十几年它仍然是Python使用者最常用的画图库。它的设计和在1980年代被设计的商业化程序语言MATLAB非常接近…...

大数据(21)-skew-GroupBy

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

window压缩包安装mongodb并注册系统服务

下载解压包 https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-5.0.22.zip启动mongod 解压压缩包 至 d:\mongodb目录中&#xff0c;创建目录data、logs。并创建配置文件mongod.conf输入以下配置 dbpath d:\mongodb\data logpath d:\mongodb\logs\mongo.log loga…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...