RxJava2的基础知识

基于opencv人脸识别实现课堂抬头率检测系统 完整代码 可直接运行 作为毕设 阅读详情

RxJava2的三要素:

观察者模式思想,函数响应式编程

1. Observable 被观察者,它决定什么时候触发时间,在上游发送命令,决定异步操作模块的顺序和异步操作的次数。
2. Observer 观察者,它可以在不同的线程中执行任务,在下游待命状态的接受事件,响应被观察者的通知。
3. subscribe订阅事件 创建好了Observable和Observer ,需要将他们关联起来,才能实现链式调用。


subscribe的使用

先写一个简单的例子

            Observable.just("Hello World")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        System.out.print("s");
                    }
                });

just:是事件的创建
Consumer是消费者,用于接受单个值。
用于简单的消费事件类型。而subscribe有多个重载方法,rxjava2中Observable不再支持订阅Subscribler,而是需要使用Obserer作为观察者

subscribe(onNext)    接受的事件
subscribe(onNext,onError)   接受的事件,错误
subscribe(onNext,onError,onComplete) 接受的事件,错误,事件接受完成
subscribe(onNext,onError,onComplete,onSubscribe)    接受的事件,错误,,事件接受完成,开始订阅
Observable.just("Hellow World")
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        System.out.println("subscrible");
                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete");
                    }
                });

上述代码会依次输出:

subscrible
Hellow World
onComplete

RxJava2中五种观察者模式:
这里写图片描述


Hot Observable和Cold Observable
Hot Observable 无论有没有观察者进行订阅,事件始终会发生。当有多个订阅者时候,其关系是一对多的关系,共享订阅者的共享事件。
Cold Observable 只有观察者订阅了,才开始执行发射数据流的代码。并且与观察者Ibserver只能是一对一的关系。当有多个观察者订阅时候,各自的事件是独立的,消息流是重新完整发送的。

Cold Observable 例子如下:可以由just、creat、from等操作符生成。

 Consumer<Long> subscriber1 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者1号输出:"+ mlong);
            }
        };

        Consumer<Long> subscriber2 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者2号输出:"+ mlong);

            }
        };

        Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
            @Override
            public void subscribe(ObservableEmitter<Long> e) throws Exception {

                /**
                 * interval(周期次数,周期时间单位,调度计算);---->返回一个Long泛型的被观察者
                 * take 返回一个被观察者对象,发送由原被观察者(Long泛型的被观察者)的事件
                 */
                Observable.interval(10, TimeUnit.MILLISECONDS,
                        Schedulers.computation()).take(Long.MAX_VALUE).subscribe(e::onNext);
            }
        }).observeOn(Schedulers.newThread());//指定下游在一个新的线程接受事件

        observable.subscribe(subscriber1);//订阅观察者1号
        observable.subscribe(subscriber2);//订阅观察者2号

        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

输出以下:

观察者1号输出:0
观察者2号输出:0
观察者1号输出:1
观察者2号输出:1
观察者2号输出:2
观察者1号输出:2
观察者1号输出:3
观察者2号输出:3
观察者2号输出:4
观察者1号输出:4
观察者2号输出:5
观察者1号输出:5
观察者1号输出:6
观察者2号输出:6
观察者1号输出:7
观察者2号输出:7
观察者1号输出:8
观察者2号输出:8
观察者1号输出:9
观察者2号输出:9

输出结果并不是一致的,可以看出二者是相互独立的,符合一般的响应式思想!但是对于某些事件不确定何时发生及不确定Observable发射的元素数量变化的情况,需要使用到Hot Observable,比如UI交互的事件、网络环境变化,地理位置变化等情况。


转换成Hot Observable
使用publish,生成ConnectableObservable ,用上面例子更换如下:

Consumer<Long> subscriber1 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者1号输出:"+ mlong);
            }
        };

        Consumer<Long> subscriber2 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者2号输出:"+ mlong);

            }
        };

        Consumer<Long> subscriber3 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者3号输出:"+ mlong);

            }
        };

        ConnectableObservable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
            @Override
            public void subscribe(ObservableEmitter<Long> e) throws Exception {
                /**
                 * interval(周期次数,周期时间单位,调度计算);---->返回一个Long泛型的被观察者
                 * take 返回一个被观察者对象,发送由原被观察者(Long泛型的被观察者)的事件
                 */
                Observable.interval(10, TimeUnit.MILLISECONDS,
                        Schedulers.computation()).take(Long.MAX_VALUE).subscribe(e::onNext);
            }
        }).observeOn(Schedulers.newThread())
                .publish();

        //生成的ConnectableObservable必须使用connect才能执行
        observable.connect();

        observable.subscribe(subscriber1);
        observable.subscribe(subscriber2);
        observable.subscribe(subscriber3);

        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
观察者1号输出:0
观察者2号输出:0
观察者3号输出:0
观察者1号输出:1
观察者2号输出:1
观察者3号输出:1
观察者1号输出:2
观察者2号输出:2
观察者3号输出:2
观察者1号输出:3
观察者2号输出:3
观察者3号输出:3
观察者1号输出:4
观察者2号输出:4
观察者3号输出:4
观察者1号输出:5
观察者2号输出:5
观察者3号输出:5
观察者1号输出:6
观察者2号输出:6
观察者3号输出:6
观察者1号输出:7
观察者2号输出:7
观察者3号输出:7
观察者1号输出:8
观察者2号输出:8
观察者3号输出:8
观察者1号输出:9
观察者2号输出:9
观察者3号输出:9

可以看出多个订阅者(观察者)共享同一个事件,而且这里的ConnectableObservable是线程安全的。

使用Subject/Processor :

Consumer<Long> subscriber1 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者1号输出:" + mlong);
            }
        };

        Consumer<Long> subscriber2 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者2号输出:" + mlong);

            }
        };

        Consumer<Long> subscriber3 = new Consumer<Long>() {
            @Override
            public void accept(Long mlong) throws Exception {
                System.out.println("观察者3号输出:" + mlong);

            }
        };

        Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
            @Override
            public void subscribe(ObservableEmitter<Long> e) throws Exception {
                /**
                 * interval(周期次数,周期时间单位,调度计算);---->返回一个Long泛型的被观察者
                 * take 返回一个被观察者对象,发送由原被观察者(Long泛型的被观察者)的事件
                 */
                Observable.interval(10, TimeUnit.MILLISECONDS,
                        Schedulers.computation()).take(Long.MAX_VALUE).subscribe(e::onNext);
            }
        }).observeOn(Schedulers.newThread());

        PublishSubject<Long> subject = PublishSubject.create();
        observable.subscribe(subject);

        observable.subscribe(subscriber1);
        observable.subscribe(subscriber2);
        observable.subscribe(subscriber3);


        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

输出结果同上!

这里讲了Hot和Cold的区别!后续会讲到五种观察者模式。

【00】虹软2023届校招专场 ,计算机类笔试攻略(笔试考试时间、考察范围、笔试难度 等说明) 虹软科技2023校招笔试攻略:三大岗位类别(算法、算法优化、开发)分别于7月24日进行。题型包括选择题、编程题和问答题,其中算法类题目降低难度,编程题改为LeetCode模式。重点考察数学基础、机器学习、编程能力(C/C++/Python)、数据结构和算法优化等。建议根据投递岗位选择问答题,算法优化类注重系统知识和SIMD优化,开发类侧重多线程等实际应用能力。笔试结果将作为校招offer的重要参考。 阅读详情

相关推荐

基于粒子群算法的PID控制器优化设计

粒子群算法、PID、寻优

qq_46107700的博客 2万+

RxJava2最全面、最详细的讲解(二)

前言:九牛一毫莫自夸,骄傲自满必翻车,历览古今多少事,成由谦逊败由奢。 一、概述 RxJava2在第一篇文章中基本用法作了详细的介绍,是一个基于事件流的异步操作库。相信大家对RxJava有了一定的理解,由于篇幅过长所以重新写了一篇,如果不了解Rxjava2可以参考下RxJava2最全面、最详细的讲解(一)。下面开始继续讲解RxJava2的其他用法。(源码和其他链接在文章最后给出) 在使用...

https://juejin.cn/user/1654096907477549/posts 7033

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

RxJava2最全面、最详细的讲解(三)

前言:不要在该奋斗的年纪去选择安逸享乐,不是每个人都能成为自己想要的样子,但是每个人都能努力成为自己想要的样子,相信自己,你能作茧自缚,最终也能破茧成蝶。 —— 致正在努力奋斗打拼的人 一、概述 RxJava如此受欢迎,是因为提供了丰富且功能强大的操作符,几乎能完成所有...

https://juejin.cn/user/1654096907477549/posts 3140

端侧部署与优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” 与 “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据和高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署与优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1052

Fortran环境配置:VS2022+Intel oneAPI安装全流程指南

Fortran环境配置:VS2022+Intel oneAPI安装全流程指南

shuyisuisuinian的博客 2万+

RxJava 2.0 全体系梳理(持续更新ing)

只有观察者订阅了,才开始执行发射数据的代码。并且Cold Observable和Observer只能是一对一的关系。当有多个不同的订阅者时,消息是重新完整发送的,也就是说,对于Cold Observeable来说,有多个Observer存在的时候,各自的事件是独立的。多个订阅的sunbscribe(或者说观察者)事件各自独立。Hot Observable 无论有没有观察者订阅,事件始终都会发生。当Hot Observable有多个订阅者时,Hot Observable与订阅者们的关系是一对多的关系。

化身孤岛的瓜 2271

k8s架构、工作流程、集群组件详解

Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。

qq_51545656的博客 4382

Android最火的框架系列(九)RxJava2

RxJava是一套响应式编程技术,实现业务和逻辑上的链式编程。RxJava和RxJava2的使用会有一些区别,这篇博客基于RxJava2。我将总结一下RxJava2的使用,整理一下RxJava2常用的操作符,针对每个操作符,都会有相应的代码,帮助我们理解。 一.RxJava概论 RxJava也是基于观察者模式:被观察者完成计算任务,观察者根据被观察者的计算结果作...

zhaojun的博客 2万+

使用HFSS仿真分支波导耦合器

本文介绍了分支波导耦合器的HFSS仿真设计过程。首先给出了器件关键参数(t=0.365mm,l=1.600mm等),详细说明了建模步骤:包括创建中心分支、设置变量参数、镜像复制两侧分支、矩形波导端口设计等操作。重点阐述了激励端口设置方法,包括四个端口的积分线绘制,以及求解频率设定。最后展示了S参数、幅度平衡度和相位差等关键性能指标的仿真结果提取方法。整个设计过程体现了HFSS在微波器件仿真中的参数化建模和结果分析能力。

shao666888的博客 180

YOLOv11涨点改进| TPAMI 2026 |独家创新首发、Conv改进篇| 引入LPM 局部先验特征增强模块,更加聚焦于目标区域并抑制背景干扰,助力目标检测、图像分割、图像恢复、图像增强有效涨点

🔥本文提出了一种改进YOLOv11网络的LPM(局部先验特征增强)模块,通过构建重要性图引导特征提取过程,使模型更聚焦目标区域并抑制背景干扰。LPM模块通过注意力机制强化关键区域信息,优化特征分布,提升小目标和复杂场景下的检测性能。实验表明,该模块在保持轻量结构的同时,显著提高了检测精度和鲁棒性。文章详细介绍了LPM的结构原理、核心代码实现方法,并提供了4种改进配置方案(yolov11n_LPM.yaml等),指导用户如何集成该模块到YOLOv11网络中。这些改进方案通过多阶段特征融合逐步强化细节表达.

Ai缝合怪、助力小伙伴高效发论文 127

RxJava2使用归纳总结

RXJava角色划分: observale: 被观察者 observer: 观察者 子类Subject【科目】 subscribe: 订阅 被观察者.订阅(观察者),被观察者通知观察者 被观察者类型: 热: 订阅完毕立即发送数据 冷: 创建以后,等待观察者订阅, 一旦订阅了,才发送数据 1. ...

dreams_deng的博客 1366

YOLOv8改进---BiFPN特征融合

yolov8结合BiFPN进行改进

qq_41920323的博客 4523

RxJava2极速入门——Rxjava理念与基础知识

目录 RxJava入门理念 函数响应式编程的概念及特点 函数编程概念 函数编程特性 响应式编程概念 响应式编程的特性 RxJava的基础知识 RxJava的创建 RxJava的生命周期回调 RxJava的五种观察者模式 Observable与Observer Flowable Single与SingleObserver Completable Maybe 总结心得 ...

易庞宙的博客 1720

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

RxJava 知识梳理(3) RxJava2 基础知识小结

前言 首先要感谢 Season_zlc 的一系列RxJava2的教程,关于上游、下游、水缸的类比,让我对于整个RxJava2的基本思想有了更加清晰的认识。大家有兴趣的话一定要多看看,写的通俗易懂,传送门:给初学者的 RxJava 2.0 教程 (一) ,本文的思想都来源于它的一系列文章。 文章比较长,为了避免耽误大家的时间,先列出需要介绍的知识点: 一、RxJava2 的基本模型 1.1 使用实...

weixin_33819479的博客 137

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

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

小白学习Rxjava2,从零开始到实战(一) RxJava2的基础使用

前言 小白学习之我见 正文 导入Rxjava2 Rxjava2的简单使用 总结前言RxJava是什么? RxJava 在 GitHub 主页上是这样说的 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可

lwlizhe的博客 3154

Rxjava2 学习路线

Rxjava2 学习路线 rxjava2与rxjava1有不同之处,但是现在有很多博客都是直接从rxjava2的基础开始讲起,可以直接从rxjava2入手。 Rxjava2 基础入门 给初学者的RxJava2.0教程 这篇文章主要用于了解rxjava如何使用以及对rxjava基础知识学习,介绍的方式也没用观察者与被观察者这种比较难懂的概念,很适合入门。文章内容比较多,但是学习起来不

spyfool的博客 356

RxJava入门

作者写的一系列有关RxJava非常通俗易懂,很适合像我这样的菜鸟学习给初学者的RxJava2.0教程

Smile.L.B的博客 248

RxJava2

RxJava2(一) 前言 **Rxjava2是基于观察者模式下的框架,学习之前最好先了解观察者模式。** 相关类库 implementation 'io.reactivex.rxjava2:rxjava:2.0.1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' 简单使用 异步+链式编程 Observable.c...

Hulk_zhang的博客 214

Android RxJava 2入门

如果您是Android开发人员,那么您可能已经听说过RxJava的好处,RxJava是ReactiveX库的一种流行的开源实现,它将反应式编程引入Java虚拟机(JVM)。 RxJava旨在减轻使用异步数据流的麻烦—尽管您将看到,RxJava对“数据”的定义非常广泛。 由于RxJava是JVM兼容的库,因此您可以在各种平台上使用它,但是在本系列中,我将向您展示如何使用RxJava 2进行A...

代码教主 327

android RXJava2.0(一)

原链接作者:Season_zlc 链接:http://www.jianshu.com/p/464fa025229e 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 看了之后只是学习记录而已要在Android中使用RxJava2, 先添加Gradle配置:compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile '

missingcall 6526

RxJava2.0相关教程

这可能是最好的RxJava 2.x 教程(完结版) https://www.jianshu.com/p/0cd258eecf60   RxJava2.0——从放弃到入门 https://www.jianshu.com/p/cd3557b1a474

weixin_33961829的博客 86

在Android中运用RxJava

1、RxJava 2.01.1、什么是RxJava和响应式编程(reactive programming)        在响应编程中,消费者对数据进行反应,这就是为什么异步编程也被称为响应式编程的原因。 响应式编程允许将事件更改传播到已注册的观察者。        RxJava是从Netflix的反向扩展(Rx)到Java的端口。 RxJava是2014年开源的,托管于http://reacti...

紫雾凌寒 3181

RxJava2.X 知识要点

RxJava2.X 知识要点 简介: 这篇文章介绍的是 RxJava2.X 的知识要点. 不会对基础知识进行讲解.   零基础的文章推荐: 给 Android 开发者的 RxJava 详解 这可能是最好的RxJava 2.x 教程(完结版) 目录: 1.RxJava 是什么? 2.RxJava 的基本实现 3.RxJava 的五种观察者模式 4.监听 Observable 生命周期的回调 ...

神经大条蕾弟的博客 344

Retrofit2+Rxjava学习到封装

一. 为什么写这篇文章RxJava和Retrofit也火了一段时间了,网上有很多RxJava与Retrofit的文章介绍,拜读一番之后,仍感觉这两个框架不接底气,对于初学者仍是丈二的和尚,不知所云,且知识点比较零碎,故写下这篇文章。 目的一: 把知识点通过一篇文章涵盖的尽量全面,减少学习成本 目的二:结合实际开发自己封装一个比较通用网络请求 目的三:从理解的层面出发,把踩过的坑明确说明,减少使用

flysweetegg的博客 661

RxJava由浅入深的学习(1)--学习路线 && Rxjava操作符的熟悉

前言如果你跟我一样,是从来没有在实际项目中运用rxjava开发的初学者,我自己列了一个学习步骤,大家可以参考一下。 1.在看官方wiki之前,我建议完全初学者可以阅读下这篇博主的文章,到目前谢了9篇,通俗易懂的很形象的讲解了rxjava的部分操作符,主要是理解rxjava。 [http://www.jianshu.com/p/464fa025229e](http://www.jianshu.com/

qq_28690547的博客 733

给初学者的RxJava2.0教程(转链接)

学习Android的大概都知道有个RxJava,这个框架已经更新到了第二个版本了。关于第一个版本基本原理也大概懂了,也能基本应用,这里面主要归功于有个大神级人物——抛物线的文章《给 Android 开发者的 RxJava 详解》,这篇文章虽然时RxJava第一个版本但是写的真心不错,为此我还打赏了作者,大家也可以去看看。然后今天看微信公众号发现有人居然写了第二个版本的博客而且有9篇于是就记录下。

Yong Ledo的博客 800
上一篇: RxJava学习(一)---Hello World
下一篇: 网络分层与TCP的三次握手与四次挥手
HUandroid
博客等级 码龄10年 35粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值