【Android】RxJava系列01-基本概述和基本用法

news2024/9/20 13:32:11

少年啊,要永远相信美好的事情即将发生

【Android】RxJava系列01-基本概述和基本用法

    • 1.RxJava的概述
    • 2.RxJava的作用
    • 3.观察者和被观察者
    • 4.背压
    • 5.RxJava的基本用法
      • 步骤一,创建Observer(观察者)
      • 步骤二,创建Observable(被观察者)
      • 步骤三,Subscribe(订阅)

1.RxJava的概述

RxJava是什么?是ReactiveX的一种Java实现。
那,ReactiveX又是什么,我来与君言。
ReactiveX 是 Reactive Extensions的缩写,一般简写为Rx,就这?确实就这。但是微软给出的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ(Language Integrated Query)风格查询操作符来编写异步和基于事件的程序。开发者可以利用Observables 表示异步数据流,用LINQ操作符查询异步数据流,用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ +Schedulers
在这里插入图片描述
啊?这这这。定义总是这么抽象,记住Rx是可观察,能异步处理数据流程序的函数库就行了

2.RxJava的作用

大家平时开发中很多场景会用到异步操作,在Android中,我们会用到AsyncTask和Handler,或者创建callback来回调,但是随着请求的数量越来越多,代码逻辑会变得复杂,对阅读代码人来说就是一种“回调地狱”。通过使用RxJava仍旧能保持清晰的逻辑。RxJava的原理是创建一个Observable对象来“干活”,然后使用各种操作符建立起来的链式操作,就如流水线一样,如德芙一样丝滑,把你想要处理的数据一步一步地加工成你想要的成品,之后发送给Subscriber处理(哟,介么帅)。

3.观察者和被观察者

RxJava的异步操作是通过扩展的观察者模式来实现的。
在RxJava中,Observable代表了被观察者,Observer代表了观察者,在RxJava 3.x中有以下几个被观察者

  • Observable:发送0个或N个数据,不支持背压。
  • Flowable:发送0个或N个数据秒支持背压,它是在RxJava2之后才有的新类型。
  • Single:只处理OnSuccess和onError事件,只能发送单个数据或者发送一个错误。
  • Compleable:Compleable在创建后,不会发送任何数据,只处理onComplete和onError
  • Maybe: 能够发送0个或1个数据。它是在RxJava

4.背压

什么是背压?
背压指的是,在异步场景中,被观察者发送事件的速度远快于观察者处理事件速度的情况下,一种告知上游的被观察者降低发送速度的策略。
从RxJava 2 开始,Observable不再支持背压,而是新增了被观察者Flowable支持背压。Flowable中的操作符和Observable类似,其所有的操作符均强制支持背压。

5.RxJava的基本用法

以RxJava3为例,引入依赖

    implementation("io.reactivex.rxjava3:rxandroid:3.0.0")
    implementation("io.reactivex.rxjava3:rxjava:3.0.0")

其中,RxAndroid是RxJava在Android平台的扩展,它包含了一些能够简化Android开发的工具。
RxJava的基本用法分为3个步骤

步骤一,创建Observer(观察者)

它决定事件触发的时候将有怎样的行为,代码如下所示

        val observer = object : Observer<String> {
            override fun onSubscribe(d: Disposable) {
                Log.e(TAG, "onSubscribe d ${d.isDisposed} ")
            }

            override fun onError(e: Throwable) {
                Log.e(TAG, "onError e $e ")

            }

            override fun onComplete() {
                Log.e(TAG, "onComplete")

            }

            override fun onNext(t: String) {
                Log.e(TAG, "onNext t: $t")

            }

        }
  • onComplete:事件队列完结,RxJava不仅把每个事件单独处理,而且还会把它们看作一个队列。当不会有新的onNext发出时,需要触发onComplete方法作为完成标志。
  • onError:事件队列异常。在事件处理过程中出现异常时,onError方法会触发,同时队列会自动终止,不允许再有事件发出,
  • onNext:普通的事件。将要处理的事件添加到事件队列中
  • onSubscibe:当订阅时会被调用

步骤二,创建Observable(被观察者)

它决定什么时候触发事件以及触发怎样的事件,RxJava使用create方法来创建一个Observable,并为它定义事件触发规则,代码如下所示:

        /**
         * 基本创建方式
         */
        val observable = Observable.create { emitter ->
            emitter.onNext("新年快乐")
            emitter.onNext("龙年吉祥")
            emitter.onComplete()

        }

通过调用subscribe的方法,不断地将事件添加到任务队列中,也可用just方法来实现:

        /**
         * 通过 just 创建
         */
        val observable2 = Observable.just("你好","我是保安队长")

步骤三,Subscribe(订阅)

订阅只需要一行代码就可以了,如下所示:

        observable.subscribe(observer)

通过create创建,输出日志如下:

	  onSubscribe d false
	  onNext t: 新年快乐
	  onNext t: 龙年吉祥
	  onComplete

通过just创建,输出日志如下:

     onSubscribe d false
	 onNext t: 你好
	 onNext t: 我是保安队长
	 onComplete

两种方式都是一样,先调用onSubscribe方法,接着调用两个onNext方法,最后调用onComplete方法。

今天的学习学习到此收尾啦,万事开头难,继续坚持,后续学习RxJava常用的操作符
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】类和对象之运算符重载(三)

前言&#xff1a;在前面我们知道在类和对象中有六个默认成员函数&#xff0c;并学习了其中三个构造函数、析构函数、拷贝构造函数&#xff0c;今天我们将进一步的学习.赋值运算符重载。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质…

UnityShader 边缘光效果

效果&#xff1a; 代码实现&#xff1a; Shader "MyShader/Sim" {Properties{_MainTex("主贴图",2D)"white"{}_MainColor("主贴图颜色",color)(1,1,1,1)_InnerSimPower("内描边强度",Range(-1.0,3.0))0.0_InnerSimColor(&…

基于springboot篮球竞赛预约平台源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;篮球竞赛预约平台也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

day2.4

D选项是不正确的。如果一个类没有定义默认构造函数&#xff0c;但该类的所有数据成员都有默认值&#xff0c;那么编译器会自动生成一个默认构造函数。然而&#xff0c;如果类中有某些数据成员没有默认值或者需要进行特殊的初始化&#xff0c;那么就需要用户自己定义一个默认构造…

小程序<swiper/>组件详解及使用指南

目录 引言微信小程序的重要性Swiper组件的角色与功能简介Swiper组件基础Swiper组件的定义与使用场景如何在微信小程序中引入Swiper组件Swiper组件的基本结构与属性Swiper组件的高级应用自定义Swiper指示点样式实现Swiper的动态效果(如自动播放、循环播放)说明引言 微信小程序…

【云原生运维问题记录】kubesphere登录不跳转问题

文章目录 现象问题排查 结论先行&#xff1a;kubesphere-system名称空间下reids宕机重启&#xff0c;会判断是否通过registry-proxy重新拉取镜像&#xff0c;该镜像原本是通过阿里云上拉取&#xff0c;代理上没有出现超时情况&#xff0c;导致失败。解决方案&#xff1a;删除re…

EasyX图形库学习(二、文字输出)

目录 一、文字绘制函数 字体属性结构体:logfont 文字输出 outtextxy 在指定位置输出字符串。 ​编辑 但如果直接使用,可能有以下报错&#xff1a; 三种解决方案&#xff1a; 将一个int类型的分数,输出到图形界面上 如果直接使用&#xff1a; 会把score输入进去根据A…

ES集群维护笔记

集群版本说明&#xff1a;es 7.5.1 REST接口 查看所有_cat接口 curl http://127.0.0.1:9200/_cat?v查看master节点 curl http://127.0.0.1:9200/_cat/master?v查看集群健康状态 curl http://127.0.0.1:9200/_cat/health?v查看节点状态 curl http://127.0.0.1:9200/_ca…

【测试运维】web自动化全知识点笔记第1篇:什么是Web自动化测试(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论Web自动化测试相关知识。了解什么是自动化&#xff0c;理解什么是自动化测试以及为什么要使用自动化测试。具体包含&#xff1a;WebDriver的基本操作&#xff0c;WebDriver的鼠标、键盘操作&#xff0c;下拉选择框、警告…

iview DatePicker 日期选择组件在弹窗中使用transfer,导致选择日期弹窗会关闭的问题

背景&#xff1a;在弹窗里面使用日期选择组件&#xff0c;选择组件的面板被弹窗遮挡了部分&#xff0c;所以需要使用transfer属性&#xff0c;但是使用之后组件面板插入body中了&#xff0c;面板的事件会导致弹窗关闭。 解决方案&#xff1a; 添加上transfer属性和指定的date-…

STL篇三:list

文章目录 前言1.list的介绍和使用1.1 list的介绍1.2 list的使用1.3 list的迭代器的失效 2.list的模拟实现2.1 结点的封装2.2 迭代器的封装2.2.1 正向迭代器2.2.2 反向迭代器 2.3 list功能的实现2.3.1 迭代器的实例化及begin()、end() 2.3.2 构造函数2.3.3 赋值运算符重载2.3.4 …

169. Majority Element

Given an array nums of size n, return the majority element. The majority element is the element that appears more than ⌊n / 2⌋ times. You may assume that the majority element always exists in the array. Example 1: Input: nums [3,2,3] Output: 3 Exampl…

【开源】基于JAVA+Vue+SpringBoot的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

学习ArtTs -- 初见ArkTs

作者&#xff1a;Uncle_Tom 原文链接&#xff1a;学习ArtTs -- 初见ArkTs-云社区-华为云 1. 前言 需要静态分析去检查一个语言&#xff0c;必须对这个语言有深刻的认识&#xff0c;才能有效的对这个语言进行有效的检查。 我常说:“作为一个程序分析员需要比一般的程序员考虑…

Springboot写一个对接钉钉机器人的小插件

钉钉机器人 有时候我门需要监控各种事件&#xff0c;需要机器人给我发给提醒 如&#xff1a;git代码交接&#xff0c;代码合并&#xff0c; 服务器异常捕获&#xff0c;。。。。 参照钉钉给我们的开发文档&#xff0c;可以发现对接起来是非常简单哈哈 这是我写的小插件以及例子…

渗透测试培训学习笔记汇总1(小迪安全)

第一天 域名 概念&#xff1a;域名&#xff08;英语&#xff1a;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的互联网上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&a…

修改MFC图标

摘要&#xff1a;本文主要讲解了MFC程序窗口图标的添加、任务栏、底部托盘的图标添加&#xff0c;以及所生成的exe文件图标的添加。 ​​​​​​​1、在资源视图添加Icon资源 透明图标怎么制作&#xff1f; 1&#xff09;点击图片》右键&#xff1a;使用画图3D进行编辑 2&a…

Optimizer:基于.Net开发的、提升Windows系统性能的终极开源工具

我们电脑使用久了后&#xff0c;就会产生大量的垃圾文件、无用的配置等&#xff0c;手动删除非常麻烦&#xff0c;今天推荐一个开源工具&#xff0c;可以快速帮助我们更好的优化Windos电脑。 01 项目简介 Optimizer是一个面向Windows系统的优化工具&#xff0c;旨在提升计算机…

Centos 7.5 安装 NVM 详细步骤

NVM&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具&#xff0c;它可以让你轻松地在多个版本之间切换。NVM 通过下载和管理 Node.js 的多个版本&#xff0c;为用户提供了一种灵活的方式来使用不同版本的 Node.js。如果你需要更多关于NVM的信息&a…

VS打包.exe文件步骤

1.借助vs自带扩展工具 2.1打开扩展栏 2.2搜索栏填入 " installer " 2.3下载安装 下载完成后&#xff0c;推出vs自动弹出安装。 2.生成安装包 2.1新建一个项目 2.2输入"setup" 直接下一步 2.3输入项目名称和存储位置、点击创建 出现该栏 2.4选择 主文件…