3分钟让你明白observeOn和subscribeOn的关系!

RxJava线程变换之observeOn与subscribeOn 目录 1.observeOn() 2.subscribeOn() 3.其他 在借助Observable实现请求网络接口我们经常会发现会指定subscribeOn()和observeOn()所属线程,那么为什么要指定所属线程呢? apiService.getList("api", "getList", page, model, pageId, createTime, "android"... 阅读详情

我最近在看rxJava,也是出了将近两年的框架了,感觉有必要学习一下,今天碰到这么个问题,observeOn和subscribeOn到底什么关系?看了很多大神的博客,也问了公司的大神,都没有给我讲明白。到最后直接一个demo解决问题。(要是不想看demo可以直接看最后的结论,推荐看demo的时候自行查阅observeOn和subscribeOn的源码,相信大家都学到现在,看看源码应该不是什么问题)

Observable.create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("-->robin");
                        subscriber.onCompleted();
                        Log.i("robin","0-->"+Thread.currentThread().getName());
                    }
                })
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        Log.i("robin","1-->"+Thread.currentThread().getName());
                        return s;
                    }
                })

                .subscribeOn(Schedulers.io())

                .map(new Func1<String, String>() {
                    @Override
                    public String call(String o) {
                        Log.i("robin","2-->"+Thread.currentThread().getName());
                        return o;
                    }
                })

                .observeOn(AndroidSchedulers.mainThread())

                .map(new Func1<String, String>() {
                    @Override
                    public String call(String o) {
                        Log.i("robin","3-->"+Thread.currentThread().getName());
                        return o;
                    }
                })

                .observeOn(Schedulers.io())
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String o) {
                        Log.i("robin","5-->"+Thread.currentThread().getName());
                        return o;
                    }
                })

                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String o) {
                        Log.i("robin","4-->"+Thread.currentThread().getName()+o);
                    }
                });

代码很简单,然后直接上log,如下图:

这里写图片描述

类似的,还有很多排列组合的方式,大家自行组合,因为我不想占用大家太多的时间了优快云的数据库大小。

结论

1 observeOn修改的是他 下面 的代码执行的线程
subscribeOn修改的是他 上面 执行代码的线程
2 observeOn之后在调用observeOn还可以修改线程,但是调用subscribeOn就不能再修改线程
subscribeOn之后在调用observeOn还可以修改线程,但是调用subscribeOn就不能再修改线程

STM32F103结合HAL库实现蓝牙遥控四麦小车的PID闭环控制 本文详细介绍了如何使用STM32F103结合HAL库实现蓝牙遥控四麦小车的PID闭环控制。从硬件选型、电路搭建到PID算法实现与调参,全面解析了四麦小车的运动控制方案,特别强调了蓝牙通信协议设计和麦轮运动学解算的关键技术。 阅读详情

相关推荐

树莓派与无人机协同实战:基于OpenCV的地标识别优化策略

本文深入探讨了基于树莓派与无人机的协同系统,重点分享了利用OpenCV优化地标识别以实现精准降落的实战策略。内容涵盖从应对复杂光照的图像预处理、鲁棒的轮廓几何过滤,到通过ROS进行稳定通信,以及实现分层控制与状态机设计,旨在提升系统在真实环境中的可靠性与性能。

y2z3a4b5c的博客 1087

RxJava之五—— observeOn()与subscribeOn()的详解

转载请标明出处:http://blog.youkuaiyun.com/xx326664162/article/details/51967967 文章出自:薛瑄的博客你也可以查看我的其他同类文章,也会让你有一定的收货!为什么多次调用subscribeOn()却只有第一个起作用? 为什么多次调用observeOn()却可以切换到不同线程 observeOn()后能不能再次调用subscribeOn()?如果

薛瑄的博客 3万+

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

rxjava2源码解析(三)observeOn线程池原理分析

observeOn 还是先说observeOn,直接看源码: public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) { super(source); this.scheduler = scheduler; this.delayError = delayError;

1022

Simpack实战:5分钟搞定轨道车辆车轮不圆的3种定义方法(附详细参数设置)

本文详细介绍了在Simpack中定义轨道车辆车轮不圆的3种高效方法:Radius deviations、Fourier coefficients和Harmonic function,并提供了详细的参数设置指南。通过实战案例和参数优化技巧,帮助工程师快速掌握车轮不圆度的定义与仿真,提升轨道车辆动力学分析的准确性和效率。

weixin_29292535的博客 204

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6269

RxJava2探索-线程切换原理之observeOn

前言 在前一篇文章《RxJava2探索-讲得清道得明的线程切换原理之subscribeOn》里我说了我会把RxJava线程切换相关的知识分成两部分来讲,如果大家没看过上一部分,我建议大家戳进去看一下,因为我这篇文章会基于里面的一些结论和原理来讲解。 在《RxJava2探索-讲得清道得明的线程切换原理之subscribeOn》这篇文章里,我们知道了Observable订阅、发射的流程,以及sun...

Rookie的专栏 1737

【UE4】PMC程序化生成戈德堡多面体详解(六边形星球)

游戏实机录屏 【魔方超新星】30天独立开发PCG Minigame《盖亚计划》作品展示,尚有不足,大佬轻喷 目录 游戏实机录屏 一、简介 二、设计思路 2.1 Disco Ball 2.2 Fibonacci Sphere 2.3 Goldberg Polyhedron 2.3.1 细分+对偶(最终方案) 2.3.2 对偶+截角(更优) 三、参考文献 一、简介 在制作Minigame初期,游戏风格想模仿《文明6》与《Polygonal Planet Proje...

ColorGalaxy 5932

RxJava线程切换之subscribeOn和observeOn详解

在前面两篇文章中我们主要讲了RxJava在实战开发中的一些应用案例,这些案例都是公司项目中的实战应用,项目在五一的时候已经上线了,通过先入为主的方式直接上案例,这也是我学习新技术的通常手法,我们通过两篇文章的介绍,大家已经掌握了RxJava的一些基本使用,这篇文章我们主要介绍RxJava的高级应用: 线程调度。 我们知道,响应式编程是通过异步和数据流来构建事物关系的编程模型,后台处理数据,前台响应...

门心叼龙的专栏 1万+

UE5高斯泼溅落地全链路:从PLY导入到实时渲染的工程实践

3D高斯泼溅(3D Gaussian Splatting)正从NeRF后处理技术演进为新一代隐式几何渲染范式,其核心在于以可微椭球体替代传统三角面片,通过协方差矩阵与球谐系数实现高质量体素化渲染。该技术突破点云精度瓶颈,但与UE5现有资产管线存在根本性不兼容——静态网格导入器无法解析scale/rot/sh系数等非标顶点语义,标准光栅化管线亦无法执行高斯核采样计算。XV3DGS-UEPlugin通过自定义资产类型、StructuredBuffer GPU数据流与专用材质节点,将高斯泼溅重构为可编辑、可LOD

weixin_33692177的博客 360

bert-ini:一种基于bert的实体对齐交互模型

本次分享一项来自IJCAI-20的实体对齐工作,该工作提出了一种不同于以往的采用图结构信息进行实体对齐的技术方案,该方案取得了当时的最好效果;不仅如此,模型本身的对齐效率在该项工作中也被考虑,实际工作中非常具备借鉴意义。

qq_33331424的博客 3155

Rxjava2学习笔记之subscribeOn()和observeOn()的关系

1、只有第一subscribeOn() 起作用(所以多个 subscribeOn() 无意义)这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn();2、observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换,这次切换开始于这次 observeOn() 的下一个操作;3、不论是 subscribeOn() 还是 obse...

yonbor605的博客 1207

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

rxjava :线程调度 subscribeOn 和 observeOn

subscribeOn 指定的是Observable自身在哪个调度器上执行,而且跟调用的位置没有关系。 observeOn 指定一个观察者在哪个调度器上观察这个Observable,当每次调用了ObservableOn这个操作符时,之后都会在选择的调度器上进行观察,直到再次调用ObservableOn切换了调度器。 多次使用 subscribeOn //subscribeOn : 切换订阅...

火星男孩的分享空间 864

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

observeOn()与subscribeOn()的区别

Observable.just("RxJava") .map(new Function<String, String>() { @Override public String apply(@NonNull String s) throws Exception {

lxj1137800599的专栏 2230

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

rxJava源码解析系列四之subscribeOn和observeOn的理解

本篇文章主要解决subscribeOn和observeOn这两个方法为什么subscribeOn只有一次有效果,observeOn切换多次回调的都有效果。 不知道朋友有没有看过rxandroid的源码,如果看过的话,就会迎刃而解,没什么疑虑啦。没看过源码的朋友,可以看看我这个系列的前几篇文章,主要是系列二和系列三的文章,讲述了线程切换的问题。在这里我只说一下这两个方法线程切换的时机以及Obser...

dxyadc的博客 1878

RxJava2:observeOn和subscribeOn的使用

知识背景: 扔物线的金典RxJava RxJava进阶一 RxJava进阶二 RxJava进阶三 RxJava进阶四RxJava的好处大家都知道,能使代码逻辑结构看起来更清晰,当需要进行前后台处理的时候,一般会进行observeOn和subscribeOn的调用,然而这2个方法的调用没有那么简单: observeOn:设置Observer观

一只鱼的博客 5929

RxJava subscribeOn和observeOn源码介绍

转载请以链接形式标明出处: 本文出自:103style的博客 Base on RxJava 2.X 简介 首先我们来看subscribeOn和observeOn这两个方法的实现: subscribeOn@CheckReturnValue @SchedulerSupport(SchedulerSupport.CUSTOM) public final Observable<T> su...

103style 1126

RxJava的多线程和并发机制(最全,最详细)

RxJava一个最大的优点就是可以非常方便的切换线程。但如果对RxJava的并发机制不了解的话,在使用RxJava API的时候经常会非常困惑,因为很多API的内部实现都用到了这些机制。 下面通过一个简单的例子开始。下面这段代码是非常简单的一个定时发送的一个代码。使用了interval这个定时方法,interval固定生成long类型的值,从0开始累加。所以map里面的lambda表达式的含义是传入一个long输出一个String。 我们打印在传入和输出的时候,分别对应的是在什么线程。 Obs

ScottePerk的博客 4515

RxJava源码分析之subscribeOn和observeOn

RxJava源码分析之subscribeOn和observeOn RxJava的特色就是可以改变他的任务线程,可以很优雅的在子线程和主线程中切换,而切换用到的两个主要方法是subscribeOn()和observeOn(). 备注:因本人水平有限,以下分析只代表本人所见,如有不当,请见谅并指出。 subscribeOn()和observeOn()的区别 subscr

茅屋 6592

RxJava observeOn()与subscribeOn()的关系

RxJava系列教程:1. RxJava使用介绍 【视频教程】 2. RxJava操作符   • Creating Observables(Observable的创建操作符) 【视频教程】   • Transforming Observables(Observable的转换操作符) 【视频教程】   • Filtering Observables(Observable的过滤操

Dream It Possible 2万+

Rx中的线程切换

初学者在使用RxJava的过程中,经常搞不清Observable的事件序列和每次操作应该怎样切换线程,切换哪个线程 首先需要搞懂在RxJava 中.subscribeOn() 和 observeOn() 之间的区别: - .subscribeOn() 用来指定Observable应该操作的调度器(Scheduler) - .observeOn() 指定 Observable在一个指定的调度器

Hanks软件库 1319

subscribeOn和observeOn的关系,使用注意事项

在使用Rxjava的过程中,经常碰到切换线程的情况,该如何正确调用该API呢? 这里有一位大神的总结: 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件;只有第一subscribeOn() 起作用(所以多个 subscribeOn() 无意义);这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 obser

kidass_x的专栏 1647

rxjava的subscribeon和observeon的线程区分

subscribeOn用于指定Observable开始执行(即被订阅时)所在的线程,通常影响数据发射的源头,比如网络请求或数据库操作所在的线程。而observeOn则影响下游操作符和订阅者的执行线程,比如更新UI需要在主线程执行。

罗春娥的技术园 204

RxJava线程切换操作符

转载自安德雷士的RxJava线程切换——ObserveOn和SubscribeOn的区别 RxJava很优势的一个方面就是他的线程切换,基本是依靠ObserveOn和SubscribeOn这两个操作符来完成的。 先来看看什么是ObserveOn和SubscribeOn,官方对他们的定义是这样的: ObserveOn specify the Scheduler on which an observ...

tinysakura的博客 451

RxJava学习-subscribeOn()和observeOn() 区别

操作符 create() 完整创建一个被观察者对象 Observable intervalRange() 每隔指定的时间就发送事件,可指定发送数据的数量

qq_34198206的博客 972

RxSwift系列(三)调度器subscribeOn、observeOn

(1)调度器(Schedulers)是 RxSwift 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。(2)RxSwift 内置了如下几种 Scheduler:● CurrentThreadScheduler:表示当前线程 Scheduler。(默认使用这个)● MainScheduler:表示主线程。如果我们需要执行一些和 UI 相关的任务,就需要切换到该 Scheduler运行。● SerialDispatchQueueScheduler:封装了 GCD 的串行队列。

KWMax 616
上一篇: 解决GooglePlayStore提示您的设备与此版本不兼容(Your device isn't compatible with this version)
下一篇: Retrofit+Rxjava实现嵌套逻辑的链式调用
DreamCarMustang
博客等级 码龄12年 10粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值