浅析RxJava 版本2.2.9 《二》线程的切换使用

RxJava之线程切换原理分析  Scheduler翻译成中文就是“调度”的意思,在RxJava里就是线程之间的调度,也就是线程之间的切换。在RxJava里默认有5种实现。  从图中可以简单看出,SingleScheduler、ComputationScheduler、IoScheduler、NewThreadScheduler的核心实现就是一个线程池,但该线程池里只会有一个线程,而newScheduledThreadPool... 阅读详情

经过上一节的基础使用,相信大家对RxJava就有一定的了解了,下边让我们继续深入的了解它。

RxJava流程图

在这里插入图片描述

在Rxjava中,Scheduler是调度器,相当于线程控制器。多分为以下五个场景场景:
查看源码得知:

   @NonNull
    static final Scheduler SINGLE;

    @NonNull
    static final Scheduler COMPUTATION;

    @NonNull
    static final Scheduler IO;

    @NonNull
    static final Scheduler TRAMPOLINE;

    @NonNull
    static final Scheduler NEW_THREAD;

    static final class SingleHolder {
        static final Scheduler DEFAULT = new SingleScheduler();
    }

    static final class ComputationHolder {
        static final Scheduler DEFAULT = new ComputationScheduler();
    }

    static final class IoHolder {
        static final Scheduler DEFAULT = new IoScheduler();
    }

    static final class NewThreadHolder {
        static final Scheduler DEFAULT = new NewThreadScheduler();
    }

    static {
        SINGLE = RxJavaPlugins.initSingleScheduler(new SingleTask());

        COMPUTATION = RxJavaPlugins.initComputationScheduler(new ComputationTask());

        IO = RxJavaPlugins.initIoScheduler(new IOTask());

        TRAMPOLINE = TrampolineScheduler.instance();

        NEW_THREAD = RxJavaPlugins.initNewThreadScheduler(new NewThreadTask());
    }
  • Schedulers.io(): I/O 操作(读写、网络信息交互…)所使用的 Scheduler。和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
      Observable.just("大宝来了").
                subscribeOn(Schedulers.io()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("just", "onSubscribe ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("just", "onNext  " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("just", "onError  " + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("just", "onComplete ");
                    }
                });

输出结果:

2019-06-18 21:44:36.220 6733-6733/com.click.guide.learningrxjava E/just: onSubscribe 
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onNext  大宝来了
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onComplete 
  • Schedulers.newThread(): 开启新线程,并在新线程执行操作
      Observable.just("大宝来了").
                subscribeOn(Schedulers.newThread()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("just", "onSubscribe ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("just", "onNext  " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("just", "onError  " + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("just", "onComplete ");
                    }
                });

输出结果:

2019-06-18 21:44:36.220 6733-6733/com.click.guide.learningrxjava E/just: onSubscribe 
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onNext  大宝来了
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onComplete 
  • Schedulers.single(): 线程单例,所有的任务都在一个线程中执行,当此线程中有任务在执行的时候其他任务将按照队列先进先出的顺序依次执行。
      Observable.just("大宝来了").
                subscribeOn(Schedulers.single()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("just", "onSubscribe ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("just", "onNext  " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("just", "onError  " + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("just", "onComplete ");
                    }
                });

输出结果:

2019-06-18 21:44:36.220 6733-6733/com.click.guide.learningrxjava E/just: onSubscribe 
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onNext  大宝来了
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onComplete 
  • Schedulers.computation(): 用于cpu密集型计算任务,不会被I/O等操作限制性能的耗时操作,例如XML,JSON文件的解析,Bitmap图片的压缩取样等,具有固定的线程池,大小为CPU核数,不可以用于IO操作,因为IO操作的等待时间会浪费cpu。
     Observable.just("大宝来了").
                subscribeOn(Schedulers.computation()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("just", "onSubscribe ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("just", "onNext  " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("just", "onError  " + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("just", "onComplete ");
                    }
                });

输出结果:

2019-06-18 21:44:36.220 6733-6733/com.click.guide.learningrxjava E/just: onSubscribe 
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onNext  大宝来了
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onComplete 
  • Schedulers.trampoline(): 在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停下来,等插入进来的任务执行完成之后,再将未完成的任务接着执行。
     Observable.just("大宝来了").
                subscribeOn(Schedulers.trampoline()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("just", "onSubscribe ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("just", "onNext  " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("just", "onError  " + e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.e("just", "onComplete ");
                    }
                });

输出结果:

2019-06-18 21:44:36.220 6733-6733/com.click.guide.learningrxjava E/just: onSubscribe 
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onNext  大宝来了
2019-06-18 21:44:36.242 6733-6733/com.click.guide.learningrxjava E/just: onComplete 
  • 另外, RXAndroid 提供了 AndroidSchedulers.mainThread(),作用在返回数据在 Android 主线程运行。

我们知道,RxJava 在切换线程时会用到了两个方法。

  • subscribeOn() :影响的是最开始的被观察者所在的线程。当使用多个 subscribeOn() 的时候,只有第一个 subscribeOn() 起作用。
  • observeOn():影响跟在后面的操作(指定观察者运行的线程)。如果想要多次改变线程,可以多次使用 observeOn。

今天就介绍到这里,这里边参考了很多牛人的博客,这里很感谢。
参考 调度器Schedulers
参考 RxJava2 线程切换原理
参考 Android:随笔——RxJava的线程切换

RxJava的消息订阅和线程切换原理 0.版权声明 1.前言 本文主要是对RxJava的消息订阅和线程切换进行源码分析,相关的使用方式等不作详细介绍。 本文源码基于rxjava:2.1.14。 2. RxJava简介... 阅读详情

相关推荐

RxJava 2.x 源码分析(二) 线程切换原理

在RxJava的使用过程中,通常会用subscribeOn来指定可观察者Observable的线程,用observerOn来指定观察者Observer的线程。本文将分析RxJava2.x的线程切换原理 先来看一个例子 Observable.create(new ObservableOnSubscribe<Integer>() { @Override ...

相忘于江湖 745

java 线程的常用方法

线程的常用方法 : 2.start 和 run @Slf4j(topic = "c.Test1") public class ThreadTest1 { public static void main(String[] args) { Thread t1 = new Thread() { @Override public void run() { log.debug("running1....").

weixin_41908066的博客 332

RxJava2 源码解析(二)

概述 承接上一篇RxJava2 源码解析(一), 本系列我们的目的: 知道源头(Observable)是如何将数据发送出去的。 知道终点(Observer)是如何接收到数据的。 何时将源头和终点关联起来的 知道线程调度是怎么实现的 知道操作符是怎么实现的 本篇计划讲解一下4,5. RxJava最强大的莫过于它的线程调度 和 花式操作符。 map操作符 map是一个高频的操作符,我

zxt0601的博客 8517

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

前言 说起来有点丢人,上周去某公司面试,做足了什么像java内存模型、hashmap原理、设计模式、Android多线程、自定义View等等相关的知识准备,然而面试的时候,前面几个一个没问!!!自定义view考察了onmeasure和Mnuspace那几个mode以及touch事件传递等,我真想给自己一巴掌,居然把那几个mode给忘了,只记得两个还拼不出单词。。。然后就问了RxJava,虽然没有...

Rookie的专栏 5792

前端埋点的实践

1、前言 开始正文前先介绍一下埋点的概念~,(熟悉的朋友可以略过) 前端埋点: 是一种手段,它的目的是上报相关行为数据,相关人员以数据为依据来分析产品在用户端的使用情况,根据分析出来的结果辅助产品优化、迭代。 BI:商业智能,公司内部做数据分析相关的部门。 2、背景 在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点的需求在互联网产品中是很常见的,目的上面也提到了。我们的追求就是又快又好的做好埋点工作,但是现实却不那么美好;目前我们团队在前端埋点方面存在一些痛点: 在构造埋点字段

Arui_0的博客 1773

达芬奇Pro开发板硬件验证全流程指南

FPGA开发板硬件验证是嵌入式系统可靠性的基石,其核心在于理解SoC启动时序、IO资源映射与高速接口物理层约束。基于Xilinx Zynq-7000异构架构的开发平台,需围绕电源完整性、时钟稳定性、信号完整性及软硬协同启动链路展开分层测试。技术价值体现在规避量产失效率、支撑高可靠工业控制与实时图像处理等场景。典型应用涵盖千兆以太网通信验证、DVP摄像头与RGB LCD显示链路调试、以及SFP+光纤接口PRBS误码率测试。本文聚焦达芬奇Pro系列开发板,深入解析JTAG下载、QSPI Flash重烧录、RGM

weixin_42453228的博客 123

高频面试--RxJava线程切换的原理

前言 最近跟朋友聊天,聊到了最近面试的高频题目就聊到了RxJava 的线程切换原理。我们Android 开发大部分应该 RxJava 都用的很6,RXJava + Retrofit + OkHttp 大礼包都用的贼6。自从用了 RxJava 之后 ,Handler 和 SyncTask 基本消失在日常代码中啦。所以本篇就从源码的角度分析 RxJava 线程切换的原理。 注意: 本篇的源码基于 RxJava 3.0.7, RxAndroid 3.0.0。还得配置基于JAVA8,否则会报错,因为RxAndroi

zhujiangtaotaise的专栏 3707

ESP32S3编译micropython固件

编译ESP32芯片的micropython固件

m0_73253860的博客 2554

Rxjava2原理流程+操作符+线程切换 浅析~

0.前言 没拜读过强大的代码就建议去稍微看一下rxjava2的原理,并不难懂。写的非常的好,也能领略到大佬写的代码有多么的强。里面的设计模式真的牛逼 1.Rxjava2 Rxjava2用于我们来做响应式编程模式的操作。用起来很简单,但是如果面试/其它场合下让你去写一些骚操作或者说其中的原理,真的蒙蔽的不行…然后去研读其代码,发现很多文章写的优点乱.让我有点理不清楚. 这就当算是我阅读源码的理解吧… 2.文章解决的问题. RxJava2的基本运行流程 map操作符的运作 线程切换原理 3.总图解 借助大佬

qq_33902817的博客 2486

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8630

论文工具——写论文好用的绘图工具(甘特图+流程图+网络模型图+泳道图)

* 在写HiFi-GAN论文的代码阅读过程中,我发现仅仅通过文字来描述网络结构,不够详细,所以想绘制出网络结构图,更加具象化的描述出网络结构。想去花了,才发现之前都是通过在线绘图网站画的,费时费力,所以想找一些专门的网站化出比较规范并且高质量的图。一方面是为了方便讲解,提高论文的质量,另外一方面也是为了以后写论文打下良好的基础。 * 这篇文章会根据我以前的画图经验展开,以前是使用绘图软件,手动绘图。后来,看到了其他的方法,但是需要写一些代码,或者需要安装特定的软件,投入成本太大,就没有学。所以,本文分享的工

Blackoutdragon的博客 1万+

RxJava 线程切换

在上篇文章对RxJava 的工作流程进行的简单的分析,今天来分享一下线程切换的流程。如果觉得源码枯燥可以直接移至文末看图理解。

WangYilei0318的博客 2231

深水区探秘:小红书App x-s参数逆向与高并发爬虫实战(2026版)

在移动互联网的碎片化时代,小红书凭借其“社区+电商”的独特模式,积累了超过3亿月活用户。其内容生态覆盖了从美妆、穿搭到旅行、数码等几乎所有垂直领域。对于数据分析师、市场研究员以及AI算法工程师而言,小红书平台蕴含的价值是巨大的——无论是热门趋势洞察、KOL画像分析,还是多模态图文数据的采集。然而,想要高效、稳定地获取小红书App的公开数据,却并非易事。与Web端相比,小红书App的防护体系堪称“铜墙铁壁”。其核心的反爬机制建立在动态混淆的加密参数之上,尤其是请求头中的X-SX-T以及X-S-Common。

2201_76125261的博客 266

【Android开源框架面试题】 RxJava框架线程切换的原理,RxJava1与RxJava2有哪些区别?

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES。

datian1234的博客 1412

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2362

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

友好 RxJava2.x 源码解析(二)线程切换

系列文章: 友好 RxJava2.x 源码解析(一)基本订阅流程 友好 RxJava2.x 源码解析(二)线程切换 友好 RxJava2.x 源码解析(三)zip 源码分析 本文掘金地址:友好 RxJava2.x 源码解析(二)线程切换 本文基于 RxJava 2.1.3 前言 示例代码 源码解析 Observer#onSubscribe(Dispose) Observable#o...

joker 1533

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RxJava 线程切换原理

推荐 推荐几篇在学习Rxjava中的阅读的文章。尤其是大神W_BinaryTree的文章,给学习过程中带来了不少启发。 什么是函数响应式编程(Java&Android版本) 函数响应式编程介绍 Rxjava2.0 较全的Api介绍和使用,可以当作开发手册 Rxjava2.0 Api介绍和使用 Rxjava2.0 和1.0的主要区别 Rxjava2.0 和1.0的主要区别 Rxjava g...

Android小菜比的博客 2036

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RxJava 线程切换流程

RxJava 线程切换流程 在客户端开发中有些时候需要多线程切换 作为Android开发者中最经典的模型是Handler+Looper+Message,这种写法稍有不慎会有内存泄漏的风险,后出了RxJava+RxAndroid 因为使用Rxjava切换线程比较简单,而且不容易出现令人讨厌的Casher。所以本人看了一下RxJava切换线程源码过程。本文章适合有一定基础的读者,只做关键代码解读。 先上一段简单的Demo 直接戳进create RxJavaPlugins 里的大部分方法都是工具类,可以不需要

zhujie_的博客 2185

面试:Rxjava线程切换原理

子线程切换主线程:给主线程所在的Handler发消息,然后就把逻辑切换过去了。主线程切换子线程:把任务放到线程池中执行就能把执行逻辑切换到子线程子线程切换子线程:把任务分别扔进两个线程就行了。

王温暖的博客 4302

rxjava线程切换主线程_Android中的rxjava多线程

rxjava线程切换主线程 重点 (Top highlight)RxJava has been in the development market for a long time but while interacting with some of my colleagues, I found out that many people haven’t started using RxJava be...

weixin_26727575的博客 2061

RxJava2的Observable变种之线程切换

RxJava的线程切换实质就是把不同的处理事务交由不同的线程去进行处理。代码流程看起来热仍然是像Observable.create(observableOnSubscribe).subscribe(observer)这种基本格式。那么线程切换流程在源码上是怎么做到的呢?另外,多个subscribeOn对应不同线程模型时,是都生效还是只对第一个线程有效,以及observeOn对应不同...

自由麦田 1693

RxJava(RxAndroid)线程切换机制

自从项目中使用RxJava以来,可以很方便的切换线程。至于是怎么实现的,一直没有深入的研究过!本篇文章就是分析RxJava的线程模型。   RxJava基本使用   先上一个平时使用RxJava切换线程的例子:   Observable observable = Observable.create(new Observable.OnSubscribe<String>() {

chenkai19920410的专栏 7880

java 切换到主线程_RxJava2线程切换原理分析

一、概述本节将分析RxJava2的线程切换模型。通过对线程切换源代码的分析到达对RxJava2线程切换彻底理解的目的。通过对本节的学习你会发现,RxJava2线程切换是如此的简单,仅仅是通过两个操作符就能完成从子线程到主线程,或者主线程到子线程,再或者从子线程到子线程的切换。对应的操作符为:observerOn:指定观察者运行的线程。subscribeOn:执行被观察者运行的线程。二、简单例子入手...

weixin_35158450的博客 765

RxJava2 线程切换原理

前言 RxJava的一个重要优点就在于可以方便的切换线程,所以就想从源码的角度探索下其切换线程的原理 一、ObserveOn ObserveOn用于切换下游执行线程,可以多次调用,每调用一次会切换一次,先来看一个例子 fun threadName(desc: String) { println("$desc ${Thread.currentThread().name}") } fun ma...

weixin_33672109的博客 835

RxJava(十五)RxJava线程的自由切换

在Android使用RxJava的时候可能需要频繁的进行线程的切换,如耗时操作放在子线程中执行,执行完后在主线程渲染界面。如下面示例代码: deferObservable(new Callable<String>() { @Override public String call() throws Exception { ...

android开发笔记 1776
上一篇: Android如何设置color透明度
下一篇: 多线程之锁的详解讲解《一》
jhonjson
博客等级 码龄11年 220粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值