Rxjava(2.Schedulers调度器)

【Android】使用 `reactor.core.scheduler.Schedulers` 提供的线程池让开发者更加灵活地执行任务 在 Android 开发中,使用提供的线程池可以让开发者更加灵活地执行任务,并且可以根据具体情况选择最合适的线程。:该调度器会使用单个线程来执行任务,适用于需要按照先后顺序依次执行任务的场景。:该调度器会使用一个无限制大小的线程池来执行 I/O 操作,适用于执行 I/O 密集型任务的场景。:该调度器会使用一个无限制大小的线程池来执行计算密集型任务,适用于执行 CPU 密集型任务的场景。:该调度器会创建一个新的并行线程池来执行任务,线程数取决于 CPU 核心数和参数的设置。 阅读详情

1、Schedulers调度器

Schedulers将用简单的方式创建多线程。对于android移动端来说,做耗时操作只能在子线程中,返回结果后刷新UI又得切换到主线程中。很多时候我们需要new Thread(),然后用Handler进行请求后的回调,或者借助Asynctask类。这样代码在一个类中这样写可能不多,但对于android来说,每个界面几乎都要请求网络,刷新UI。因此这样的工作一来增加的代码量,不容易维护。二来面对复杂的业务需求的时候,不容易修改和实现。

Scheduler为rxjava添加多线程调度的功能,可以指定操作符在某个调度器(Scheduler)上运行。

Rxjava提供了5种调度器:

  1. io()
  2. computation()
  3. immediate()
  4. newThread()
  5. trampoline()

这里写图片描述

1、Schedulers.i0()

主要用于一些耗时操作,比如读写文件,数据库存取,网络交互等。
这个调度器根据需要,增加或者减少线程池中的线程数量。需要注意的是Schedulers.i0()中的线程池数量是无限制大的,大量的I/0操作将创建许多线程,我们需要在性能和线程数量中做出取舍。

2、Schedulers.computation()

计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。

3、Schedulers.immediate()

默认的,直接在当前线程运行。

4、Schedulers.newThread()

开启一个新的线程

5、Schedulers.trampoline()

当我们想在当前线程执行一个任务时,并不是立即执行,用trampoline()将它加入队列。这个调度器将会处理它的队列并且按程序运行队列中每一个任务。

6、AndroidSchedulers.mainThread()

Android中专用的,指定的操作在Android的主线程(UI线程中)运行。

2、SubscribeOn和ObserverOn

SubscribeOn

指定Observable自身在哪个调度器上执行,可以使用SubscribeOn操作符指定Observable在一个特定的调度器上运行。

ObserveOn

指定Observable应该在哪个调度器上调用观察者的onNext, onCompleted, onError方法,你需要使用ObserveOn

也就是说:
subscribeOn()主要改变的是订阅的线程,即call()执行的线程;
observeOn()主要改变的是发送的线程,即onNext, onCompleted, onError执行的线程。

仍物线总结:
、
1、只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
2、 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()
3、observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
4、不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程

3、示例

示例1

Observable
.map                    // 操作1
.flatMap                // 操作2
.subscribeOn(io)
.map                    //操作3
.flatMap                //操作4
.observeOn(main)
.map                    //操作5
.flatMap                //操作6
.subscribeOn(io)        //!!特别注意
.subscribe(handleData)

操作1,操作2是在io线程上,因为之后subscribeOn切换了线程
操作3,操作4也是在io线程上,因为在subscribeOn切换了线程之后,并没有发生改变。
操作5,操作6是在main线程上,因为在他们之前的observeOn切换了线程。
特别注意那一段,对于操作5和操作6是无效的

示例2

下面一个网络请求,请求在io线程中,请求后返回数据后的回调在主线程中,可以刷新UI。

  subscription = com.example.rxjava.Network.getNewFunApi().getNewTop("1", "10")
                .subscribeOn(Schedulers.io())//指定subscriber在I/0线程中执行
                .observeOn(AndroidSchedulers.mainThread())//在主线程中执行
                .subscribe(new Observer<NewTop>() {
                    @Override
                    public void onCompleted() {
                        //swiperefresh.setRefreshing(false);
                        Log.i("--rxjava--", "onCompleted");

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("--rxjava--e", e.toString());

                    }

                    @Override
                    public void onNext(NewTop d) {
                        Log.i("--date", d.getData().toString());
                    }
                });
    }
RxJava2.0线程调度深入解析与实战教程 在Android开发中,异步编程已成为构建高性能、高响应性应用的核心手段,而RxJava2.0作为响应式编程库的代表,其线程调度机制则是实现高效异步任务处理的关键。通过与两个核心方法,开发者可以灵活控制任务的执行线程与结果的消费线程。本章将从整体视角切入,剖析线程调度在RxJava2中的作用原理,帮助开发者建立对线程切换流程的初步认知,为后续章节的深入分析打下坚实基础。RxJava2 提供了一组内置的调度器(Schedulers),用于控制任务的执行线程。 阅读详情

相关推荐

ICESat-2数据下载的两种方法

ICESat-2数据下载

weixin_46341898的博客 2899

RxJava 线程切换,AndroidSchedulers 源码分析(三)

RxJava线程类型有以下几种: Schedulers.io() 用于网络请求、访问数据库等耗时操作,线程数量无限制 Schedulers.newThread() 创建新的线程,需要慎用,用在长时间运行在后台不会频繁创建和销毁 Schedulers.computation() 大量数据和图片处理,线程有最大值的限制 Schedulers.immediate() 当前线程,可以理解为默认的是这...

Deaht_Huimie的博客 1416

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2031

Android最简单的线程调度工具

1、背景介绍。 Android是多线程的系统,线程分为UI线程与工作线程。 UI线程:app的主要线程:主要负责UI的操作。工作线程:主要负责除了UI线程操作的一切线程。 问题所在: 但是很多开发者觉得切换线程麻烦并且容易内存泄漏,所以就不怎么去切换线程操作,能在主线称进行的操作就不在工作线程中执行。但是这样会导致 一、UI线程工作繁重。二、并且系统流畅性差。三、不定时的anr。 不使用工作线程来做非UI线程的工作的原因: 使用工作线程来做非UI线程的工作,需要开启线程,还要考虑到类被销毁后内存

u013265344的博客 785

Oracle GoldenGate (OGG) 实战:从安装到故障排查的完整避坑指南

本文提供了一份详尽的Oracle GoldenGate实战指南,涵盖从环境准备、核心进程配置到性能调优与故障排查的全过程。重点解析了OGG安装与部署中的常见陷阱,并分享了确保数据同步链路稳定运行的高级运维技巧与常见故障处理方法,帮助技术人员高效避坑。

weixin_29230649的博客 380

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子对接和分子动力学模拟的全流程,包括文件准备、拓扑生成、复合物构建、溶剂化处理、能量最小化及平衡模拟等关键步骤。通过实战案例,帮助研究者验证药物分子与靶标蛋白的结合稳定性,提升分子动力学模拟的效率和准确性。

weixin_29216353的博客 380

我的android多线程编程之路(2)之RxJava Schedulers源码分析

写在伊始上一篇介绍了线程的一些基础知识和工作这么久以后对于多线程部分的使用经验之路,这篇主要对RxJava线程控制部分进行分析。RxJava(本文就RxJava2.0分析)说实话,近一年多一直在用rxjava进行项目架构的编写及封装及一些异步请求的处理等等。真的很好用,但本文只对其线程部分进行分析。如果你想学习rxjava的话,推荐您看一下如下几篇文档,也是一点一点学过来的,希望可以帮到您。http

say_from_wen的博客 1783

升级最新IDEA版本(2022.1.1)

升级最新IDEA版本(2022.1.1)

软件老王 3万+

RXJava找不到AndroidSchedulers

原因: 还需要依赖一个 RxAndroid,RxAndroid里有AndroidSchedulers,RxJava里是没有的(类似于Java的SDK不会包含AndroidSDK里的TextView) 解决办法: 1.可以增加RxAndroid依赖 2.自己写一个AndroidSchedulers,以下代码: public class AndroidScheduler impleme...

T的专栏 4895

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

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

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

RxJava 2 Android 调度器终极指南:Schedulers.io() 与 AndroidSchedulers.mainThread() 的完美应用

掌握 RxJava 2 在 Android 开发中的线程调度是提升应用性能和用户体验的关键。本完整教程将深入解析 **Schedulers.io()** 与 **AndroidSchedulers.mainThread()** 这两个核心调度器,通过实际示例展示如何优雅地处理 Android 应用的线程切换问题。 ## 为什么 Android 开发需要调度器? Android 应用开发中,主线

gitblog_00172的博客 1010

lwip-2.0.3

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

RxJava2.0(二)Schedulers线程调度器

上一节教程讲解了最基本的RxJava2的使用, 在本节中, 我们将学习RxJava强大的线程控制Schedulers.

m0_49508485的博客 1107

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RxJava2源码分析——线程切换

本文章主要是对RxJava2的线程切换流程进行源码分析,在阅读之前,可以先阅读以下文章: RxJava2源码分析——订阅 本文章用的RxJava和RxAndroid版本如下: implementation 'io.reactivex.rxjava2:rxjava:2.2.6' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' 我们先写段示...

qq_20417381的博客 306

史上超详细的RxJava2使用和RxLifecycle生命周期管理,解决RxJava内存泄漏

这篇文章基于RxJava2.0 RxJava是什么? 官网说RxJava是一个可观测的序列来组成异步的额,基于事件的库,简单来说,它就是一个实现异步的库,可以代替Android的API如AsyncTask ,Handler等等。 RxJava为什么好? RxJava其实就是提供一套异步编程的API,这套API是基于观察者模式的,而且是链式调用的,所以使用RxJava编写的代码逻辑会非常简洁。 观察者模式: 定义:对象间一种一对多的关系,使得每当一个对象改变,则所有依赖于它的对象都会得到通知并被自动更新

chuyouyinghe的专栏 1772

RxJava2知识回顾之RxJava线程调度

RxJava默认的发送事件与接收事件均与当前线程在同一个线程。切换线程就需要使用到Schedulers/AndroidSchedulers进行切换。 简单的来说, subscribeOn() 指定的是上游发送事件的线程, observeOn() 指定的是下游接收事件的线程。 //设置上游发送事件在新的子线程,下游接受事件在主线程        observable.subscribeOn...

Garnett2012的专栏 406

切换主线程_RxJava 2.x源码解析(二): 线程切换

上一篇文章Rxjava2.x源码解析(一): 订阅流程中我们讲了 RxJava2 的订阅部分的源码。但 RxJava2 最强大的部分其实是在异步。默认情况下,下游接收事件所在的线程和上游发送事件所在的线程是同一个线程。接下来我们在上一篇文章的示例代码中加入线程切换相关代码: // 上游 observable Observable<Integer> obse...

weixin_35748962的博客 157

给初学者的RxJava2.0教程(二)(转载)

前言 上一节教程讲解了最基本的RxJava2的使用, 在本节中, 我们将学习RxJava强大的线程控制. 正题 还是以之前的例子, 两根水管: RxJava 正常情况下, 上游和下游是工作在同一个线程中的, 也就是说上游在哪个线程发事件, 下游就在哪个线程接收事件. 怎么去理解呢, 以Android为例, 一个Activity的所有动作默认都是在主线程中运行的, 比如我们在onCr...

161

RxJava之调度器(Schedulers)

作为一个Android开发者,耳熟能详的一句话就是,Android的主线程不能做耗时操作,具体啥原因也不用多说了。  RxJava作为广泛应用的工具库,不应该没有对耗时操作的处理。对于多线程和并发编程应该有独特的理解。在之前的基础上,我们深入理解RxJava中的调度器(Schedulers)在Android开发中如何以响应式的方式创建网络操作,内存访问,以及耗时任务。 调度器(Schedul

行云间 6275

GraphRAG Workbench导入导出指南:复用Microsoft GraphRAG输出与一键迁移知识图谱

GraphRAG Workbench 是一款把文档变成可交互 3D 知识图谱的本地可视化工作台,它的**导入导出**功能让你无需重新索引,就能复用已有的 Microsoft GraphRAG 输出成果,并把整个知识图谱一键迁移到另一台机器。本文带你快速掌握 3 个操作入口、2 种导入方式、1 个本地快照备份机制,以及常见报错的解决办法。 ## 导入导出功能总览:3 个入口一次看懂 🧭 所有导

gitblog_00064的博客 473

java的scheduler_RxJava之Schedulers

Schedulers是RxJava的主要组件之一。负责在不同线程上执行Observables的操作,便于将耗时任务分摊到其他线程。本文将会学习调度器的类型和使用场景。IO最常见的调度器之一。用于IO相关操作。比如网络请求和文件操作。IO 调度器背后由线程池支撑。它首先创建一个工作线程,可以复用于其他操作。当然,当这个工作线程(长时间任务的情况)不能被复用时,会创建一个新的线程来处理其他操作。这个好...

weixin_39805529的博客 399

调度器Schedulers

调度器Schedulers     如果你想给Observable操作符链添加多线程功能,你可以指定操作符在特定的调度器上执行。某些ReactiveX的Observable操作符有一些变体,他们可以接受一个Scheduler参数。     这个参数指定操作符将他们的部分或者全部任务放在一个特定的调度器上执行。Scheduler(线程调度器)赋予了RxJava简洁明了的的异步操作,可以说是Rxjav...

medier的博客 4764

java scheduler 性能_RxJava之Schedulers

Schedulers是RxJava的主要组件之一。它们负责在不同线程上执行Observables的操作。它们便于将耗时任务分摊到其他线程。本文将会学习下调度器的类型和使用场景。IO最常见的调度器之一。它们用于IO相关操作。比如网络请求和文件操作。IO 调度器背后由线程池支撑。它首先创建一个工作线程,可以复用于其他操作。当然,当这个工作线程(长时间任务的情况)不能被复用时,会创建一个新的线程来处理其...

weixin_28749363的博客 266

RxJava之Schedulers源码介绍

转载请以链接形式标明出处: 本文出自:103style的博客 Base on RxJava 2.X 简介 RxJava 的 Schedulers 提供了以下五种 Scheduler(调度器): SINGLE COMPUTATION IO NEW_THREAD TRAMPOLINE static { SINGLE = RxJavaPlugins.initSingleScheduler...

103style 941

最简单易懂的RxJava2.0学习教程之RxJava2的线程调度(二)

一、RxJava2线程调度使用RxJava的时候,在没有切换线程的情况下, 上游(observable)和下游(observer)是工作在同一个线程中的,即都在主线程中。话不多说上代码:Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() { @Overr

4618
上一篇: android观察者模式
下一篇: 一步一步学自定义View(1.简单入门)
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值