RxJava2 学习笔记

Rxjava2学习demo Rxjava2的学习资料,Rxjava2最新的api整合学习,希望能不断的积累知识。 立即下载

有关 RxJava2 的学习笔记
额外参考文章:Android 响应式编程 RxJava2 完全解析


一、给初学者的RxJava2.0教程系列

1、创建的 Observable 和 Observer 的实例,不是一次性的(暂时需要加上某些前提,如在一般情况下),可以被重复使用,如下面代码所示:


Observable<Integer> observable = Observable.create(observableEmitter -> {
    observableEmitter.onNext(1);
    observableEmitter.onNext(2);
    observableEmitter.onNext(3);
    observableEmitter.onNext(4);
    observableEmitter.onComplete();
});
Observer<Integer> observer = new Observer<Integer>() {
    @Override
    public void onSubscribe(Disposable disposable) {
        System.out.println("onSubscribe");
    }

    @Override
    public void onNext(Integer integer) {
        System.out.println("====> "+integer);
    }

    @Override
    public void onError(Throwable throwable) {

    }

    @Override
    public void onComplete() {
        System.out.println("complete");
    }
};
observable.subscribe(observer);
observable.subscribe(observer);

对应的信息会打印两次,这就表明两个实例都是用来表示处理过程的,而不是表明一种一次性的状态的,observable 一被订阅(即使用 subscribe() 方法)就会触发对应逻辑的发射。


2、subscribeOn() 指定的是 Observable 发射事件的线程,即 create、just 等发射数据时的线程(多次指定其所属线程只有第一次指定的有效,因为 create、just 等都是互斥的), 如果没有指定默认为当前线程。
observeOn() 指定的是 Observer 接收事件的线程,包括map 等方法 所处的线程(多次指定其所属线程是可以的, 也就是说每调用一次 observeOn() , 其所属线程就会切换一次。如果没有指定,默认为 Observable 发射事件的线程。
例如想让 map() 在 Schedulers.newThread() 线程中执行,则需要在使用 map() 前通过 observeOn(Schedulers.newThread()) 设置即可)。


3、《给初学者的RxJava2.0教程(九)》中:
FlowableEmitter 的 requested() 方法的结果表示未满足的订阅者通过 subscription.request() 方法请求的个数。

在订阅者与被订阅者同步的情况下,如果订阅者请求数据的个数小于被订阅者发送的数据个数,被多余的发射出的数据就被缓存起来,但是被缓存的数据个数超出了设置的背压策略的缓存个数时,就会出现异常 MissingBackpressureException(比如背压策略为 BackpressureStrategy.ERROR 时,最多能缓存 128 个被发射的数据)。

在订阅者与被订阅者异步的情况下,在被订阅者的线程中会内置单独的 request() 实例方法进行请求(会在一个特殊的时机触发该方法),将被订阅者的数据发射到缓存中,然后订阅者中的涉及的 request() 方法是另外一个实例的,不同于那个内置,且该实例的 request() 方法会从缓存中请求数据(暂时认为从缓存中请求,因为不知道当订阅者请求数据的速度大于发射数据速度时,被发射的数据会不会先经过缓存在被订阅者接收,不过猜想应该会直接由被订阅者发送给订阅者,因为这样效率相对搞高一点)。
当背压策略为 BackpressureStrategy.ERROR 时,当订阅者从缓存中请求了第 96 个数据时,就会触发内置单独的 request() 实例方法请求被订阅者将下一波数据发射到缓存中。(假设被订阅者能够满足非常大的数据发射量,那如果一次性请求150个,此时缓存中有 128 个,从缓存中取了 128 个后,是不是剩下的直接由被订阅者发射到订阅者中,不经过缓存,然后150个之后的又会被缓存起来)


二、这可能是最好的RxJava 2.x 入门教程

1、教程(三)
(1) 在使用 timer 和 interval 会在默认的子线程中进行。

(2) doOnNext 用于让订阅者在接收到数据之前对发射对数据进行某些处理,如缓存等,但是不建议改变本来的数据,如果在该方法中改变了数据,则订阅者收到的数据也会被改变。

(3) skip 是跳过前 x 个数据,不是每隔 x 个数据。

(4) take 表示最多接受 x 个数据,因此可以使用该方法取前 x 个数据。

(5) just 是接受的是什么类型的参数,就会将该参数以对应的类型发射出去。如 just(new int[]{...}) 则订阅者会接受到数组类型的参数,而不是将数组中的元素逐个发射,这个与 1.x 中的 from() 存在区别,但是需要注意,如果是 just(1,2,3) 则订阅者会收到三个 Integer 类型的参数。


2、教程(四)
(1) debounce 用于除去小于特定时间跨度的数据,如下:

    Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1); // skip
                Thread.sleep(400);
                emitter.onNext(2); // deliver
                Thread.sleep(600);
                emitter.onNext(3); // skip
                Thread.sleep(100);
                emitter.onNext(4); // deliver
                Thread.sleep(605);
                emitter.onNext(5); // deliver
                Thread.sleep(510);
                emitter.onComplete();
            }
        }).debounce(500, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.io())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        Log.d(TAG, "debounce :" + integer + "\n");
                    }
                });

这里写图片描述
这里要注意啊,发射了 1 之后,因为再发射 2 的时候,会间隔 400ms,小于设定的 500ms,所以 1 会被除去,3 也同理。而不是某种惯性的认为的那样,对,就是非正确结果想的那样

(2) defer 才开始看的时候,一直不能理解其 在订阅后才生效的(也就是延迟) 的特性,后来在看了 【译】使用RxJava实现延迟订阅 才有所理解。

public class Test {

    public static void main(String args[]) {
        SomeType instance = new SomeType();
        Observable<String> value = instance.valueObservable();
        instance.setValue("Some Value");
        value.subscribe(System.out::println);
    }
}

class SomeType {
    private String value = "Init value";

    public void setValue(String value) {
        this.value = value;
    }

    public Observable<String> valueObservable() {
        return Observable.just(value);
    }
}

在非延迟的情况下,就像上面代码的直接使用 just 打印结果为 Init value,这种情况下,如果 value 没有被初始化,即

private String value = null;

还会因为 RxJava2 不支持 null 而报异常。

而使用 defer ,

Observable.defer(() -> Observable.just(value));

结果就会像预期那样打印为 Some Vaule

用本人理解后的话说就是,defer 发射的数据每次都会对应数据实例被发射时(即被订阅)的最新值。而且还需要注意每次被订阅都会创建一个新的Observable对象。这就对性能来说会有一定的影响了。如果对性能有要求的话,可以参照那篇译文中的自己的封装一下create() 方法。

public Observable<String> valueObservable() {
    return Observable.create(observableEmitter -> {
        observableEmitter.onNext(value);
        observableEmitter.onComplete();
    });
}

(3) last 的参数是表示没有值的时候的默认值,如下:

    Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onComplete();
            }
        }).last(4).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d("TAG", ""+integer);
            }
        });

输出为 4,这里需要注意的是 RxJava2 发射的数据支持 null 了。


(4) window 参照 RxJava操作符(二)Transforming Observables 一文的第六点,比较详细一点。
个人的暂时理解是将数据按照该方法的第一个参数 timespan(时间间隔) 进行分类,分类之后以多组数据分别以新的 Observable 发射。


3、教程(五)
(1) concat 可以做到有序的发射两个甚至多个 Observable 的发射事件(只接受相同泛型的参数),并且只有前一个 Observable 终止(onComplete) 后开始下一个 Observable。如下:

Observable<Integer> o1 = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(ObservableEmitter e) throws Exception {
        Log.d("TAG", "o1 " + Thread.currentThread());
        e.onNext(1);
        e.onNext(2);
        e.onNext(3);
        e.onComplete();//注意
    }
}).subscribeOn(Schedulers.newThread());
Observable<Integer> o2 = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(ObservableEmitter e) throws Exception {
        Log.d("TAG", "o2 " + Thread.currentThread());
        e.onNext(4);
        e.onNext(5);
        e.onNext(6);
        e.onComplete();
    }
}).subscribeOn(AndroidSchedulers.mainThread());
Observable.concat(o1, o2)
        .subscribe(new Consumer() {
    @Override
    public void accept(Object o) throws Exception {
        Log.d("TAG", "subscribe " + Thread.currentThread());
        Log.d("TAG", o.toString());
    }
});

当每个 Observable 都指定了不同都线程时,则在 subscribe() 中则就因为不同线程发射都数据而切换到不同到线程。就像上面到代码,会有如下打印:
这里写图片描述
因为被处理时处于不同都线程,所以是并行处理,但是会按照顺序来。

而如果指定了 subscribe() 的线程(即在该方法前加上 observeOn(Schedulers.newThread())),则会在指定的线程中处理数据:
这里写图片描述
且所有数据都在同一线程中被处理,所以是串行处理。

VN5620硬件接口介绍 VECTOR, VN5620, 诊断 阅读详情

相关推荐

STM32N6:MCU+NPU架构如何重塑边缘AI部署新范式

STM32N6作为业界首款MCU+NPU架构的通用微控制器,通过集成600 GOPS算力的NPU与800MHz Cortex-M55内核,实现了边缘AI部署的革命性突破。该方案在工业视觉和智能家居等场景中,以超低功耗和成本提供实时AI处理能力,性能较传统MCU提升超100倍,重塑了边缘智能设备的设计范式。

g8f9d0s1a2的博客 1292

RxJava 2.x 使用最佳实践

转载请标明出处:http://blog.youkuaiyun.com/zhaoyanjun6/article/details/76443347 本文出自【赵彦军的博客】 以前写过 Rxjava 系列教程, 如下所示 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid 三(生命周期控制和内存优化) RxJava

赵彦军 2万+

[OpenCV]使用霍夫变换精准检测圆形原理详解与代码实战

dp`是累加器分辨率与图像分辨率的反比,例如`dp=1`时累加器与图像具有相同的分辨率,`dp=2`时累加器分辨率为图像的一半;`HoughCircles`函数的返回值`circles`是一个包含检测到的圆的参数列表,每个圆的格式为`(x, y, r)`,分别代表圆心的x坐标、y坐标和半径。可以使用`cv2.circle()`函数在原图上绘制出检测到的圆,并使用`cv2.imshow()`或`cv2.imwrite()`显示或保存结果图像。霍夫圆变换是霍夫变换的一种扩展,专门用于检测图像中的圆形轮廓。

yr_lu的专栏 513

当Retrofit2+RxJava2遇到为null的返回结果

前言 更新RxJava2之后,就不能在onNext里面发送null值了。但是项目中有些接口,例如更新用户密码的接口(我就遇到了),后台没有返回数据(也就是null),于是修改密码成功,但是活动crash(没有走onNext方法,而是走onError方法,但是异常对象也是null,提示Null is not a valid element),在网上找到了一片文章当Retrofit2+RxJava2遇...

parade岁月的博客 6347

嵌入式开发避坑指南:手把手教你用STM32CubeMX配置W9825G6KH SDRAM(含时序参数详解)

本文详细介绍了如何使用STM32CubeMX配置W9825G6KH SDRAM,包括硬件连接检查、CubeMX初始化步骤、时序参数优化及稳定性问题排查。通过实测波形分析和案例分享,帮助开发者避免常见配置错误,提升嵌入式系统性能与稳定性。

weixin_42542669的博客 197

ENSP之配置静态路由

ENSP之配置静态路由 两台路由器两台PC 拓扑图如下: 配置AR1线路上的两条IP地址 配置AR2线路上的两条IP地址 3.AR2上 配置静态IP 路由 AR1上 配置静态IP 路由 设置两台PC 的IP地址 网关 PC1 PC2 全部配置好了之后 现在测试PC1是否ping 得通PC2 在命令行输入 成功的话如下图 ...

浪友与泪的博客 3545

【android学习】RXJava2方法简介

简介 一个可观测的序列来组成异步的、基于事件的程序的库。(简单来说:它就是一个实现异步操作的库) GitHub地址:https://github.com/ReactiveX/Rxjava 三个基本元素 分别为被观察者(Observable),观察者(Observer),订阅者(subscribe) 观察者(Observable) onSubscribe() 订阅观察者的时候...

zkq49099的专栏 232

用OpenCV+ROS实现焊接机器人智能纠偏:线激光视觉的算法调参全流程

本文详细介绍了基于OpenCV和ROS的焊接机器人智能纠偏系统全流程。通过线激光视觉系统实时感知焊缝,重点解析了抗干扰图像预处理、改进的Steger算法提取激光条纹中心线,以及从2D像素到机器人基坐标系的完整坐标变换。该系统为应对焊接飞溅、弧光等复杂工况,实现高精度实时路径纠偏提供了从算法优化到工程集成的完整解决方案。

vodka的博客 160

Android Rxjava之just方法的使用

直接上代码! 定义三个方法 public int getInt(){return 1;} public String getString(){return "wsl";} public boolean getBoolean(){return true;}2.开始//观察一个方法 Observable.just(getInt(),getString(),getBoolean

曲洋的博客 5306

工业视觉实战:用摄像头+AI高精度测量钢板尺寸(附深度分析)

摘要: 钢铁制造业正加速采用基于摄像头与深度学习的视觉测量技术,以取代传统人工测量,实现钢板长、宽、高(厚)的非接触、高精度在线检测。核心方案包括单目视觉(低成本但受限于变形)、双目/多目立体视觉(可精确测量变形钢板)及3D激光扫描(微米级精度)。系统精度受硬件(相机分辨率、镜头)、算法(亚像素技术)及环境稳定性共同影响,综合精度可达±0.1mm。实战中需重点解决热膨胀(需红外测温实时补偿)和钢板变形(必须采用三维方案)两大挑战,并通过工程化设计(散热、防振)确保系统可靠运行。该技术需融合光学、机械与算法,

数字人生 391

基于VLFM的中文指令视觉语言导航系统设计与实现

文章摘要 本文介绍了一个基于VLFM(视觉语言边界地图)的中文指令视觉语言导航系统设计与实现。该系统采用模块化架构,包含三维场景渲染、URDF机器人仿真、VLFM导航引擎、中文指令解析和PyQt图形界面五大核心模块。系统支持自定义GLB场景模型和URDF机器人模型,通过transformers和langchain实现中文自然语言指令解析,利用VLFM算法进行语义导航决策。技术实现上详细介绍了GLB模型加载器开发、URDF机器人控制、VLFM导航算法集成以及PyQt界面设计。该系统在Ubuntu环境下运行,依

AI的内部世界的博客 211

Rxjava2 学习笔记

一、基础 1、核心设计模式:观察者模式。Rxjava2分Observable和Flowable两种(无被压和有被压),A(Observer)观察B(Observable),A是观察者,B是被观察者,被观察者B订阅观察者A 2、创建被观察者 Observable.create(new ObservableOnSubscribe<String>() ...

hhxsp的博客 290

【Android 11】使用Android Studio调试系统应用之Settings移植(五):编译Settings 模块、解决编译错误

基于Andorid 11,系列第5篇文章,本章开始,终于轮到解决正主Settings的编译问题了,使用android studio编译出Settings.apk,能看到这一章的同学,也着实不容易了,再接再厉

上周的博客 3919

【RxJava学习笔记】RxJava2 Retrofit的retryWhen重试机制

RxJava2的写法如下: 接口例子: @POST("pos/getUserIds") Observable&lt;Object&gt; getUserId(); 请求接口: public void executeWithRetry(Observable observable, Observer&lt;T&gt; observer) { Disposable disp...

Kam要努力学Android要去骑行要去徒步要去旅行要走天涯 3306

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RXJava2 全面学习笔记 (上)

本篇文章主要是一份学习笔记 感谢博主:https://www.jianshu.com/u/383970bef0a0

Sincerity_的博客 705

lwip-2.0.3

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

Android rxjava2 学习笔记

____tz_zs 五种观察者模式 Observable 能够发射 0 或 n 个数据,并以成功或错误事件终止 Flowable 能够发射 0 或n个数据,并以成功或错误事件终止。支持背压,可以控制数据源发射的速度 Single 只发射单个数据或错误事件 Completable 从来不发射数据,只处理 onComplete 和 onError 事件。可以看成 Rx 的 Runnable Maybe 能够发射 0 或者 1 个数据,要么成功,要么失败。有点类似于 Optional do操作符 doOnS

tz_zs的博客 772

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

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

Android学习笔记——RxJava2基本使用

笔记尚未完成,需更新 依赖 //RxJava2 implementation 'io.reactivex.rxjava2:rxjava:2.0.2' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' 使用方法 观察者与被观察者 observable ——被观察者, 可理解为一个绑定了事件Listene...

Saqino的博客 507

【学习笔记】RxJava2初使用

引入依赖 compile 'io.reactivex.rxjava2:rxjava:2.0.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

OnlyWenga的博客 452

RxJava2学习笔记

参考资料 给 Android 开发者的 RxJava1.x 详解 这可能是最好的RxJava 2.x 教程 ReactRx官网 RxJava2-Android-Samples RxJava2Examples 什么是响应式编程 响应式编程是一种基于异步数据(事件)流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流。 响应式编...

yuanyang5917的专栏 430

RxJava学习笔记2

上一篇RxJava学习笔记1只是介绍了RxJava最基本的使用方法,但是RxJava核心是异步,上篇所有的操作默认是在同一个线程中进行操作,下面我们介绍RxJava中一个比较核心的概念:Scheduler ->>>>>>用于线程调度 不指定线程的情况下, RxJava 原则是运行在同一个线程里,即:在调用 subscribe()的线程中,生产事件,消费事件。 如果需要指定线程,就需要用到 Sc

柠檬橙37号 426

RxJava2_学习笔记

RxJava2学习笔记 参考资料: 入门:https://www.jianshu.com/p/d149043d103a 操作符详解:https://www.jianshu.com/p/0cd258eecf60 实战练习:https://www.jianshu.com/p/c935d0860186 gayhub官网:https://github.com/ReactiveX/RxJava ...

徒破壁的博客 252

Rxjava 2学习笔记(一)

Rxjava 2学习笔记(一)   Rxjava 在这些年在android开发中非常的火爆,它和Retrofit 的结合堪称完美,他们可以把我们从以前我们进行网络请求中各种线程切换,各种接口回掉中解放出来了。可以让我们的逻辑变的非常清晰,便于代码维护。我们公司的项目目前使用的Rxjava 版本还是1.0版本的,准备打算升级到使用Rx2.0。所以打算学习一下Rxjava 2 Observable.c...

huangjie的博客 399

RxJava学习笔记2:基于RxJava+okHttp的Rest Cas登录实现

1.本来打算用已经对RxJava提供支持的Retrofit2实现,但Retrofit2的文档基本没有,没有找到可以获取Cookie、对status code处理的方法,所以还是用okHttp进行了实现 2.上周开始学习RxJava,是想解决多个网络请求嵌套访问的问题,CAS算是比较典型的多个同步请求后才能获取实际需要的内容 3.代码中用到了”如何用okHttp进行Cookie的自动管理”,App

kyleada的专栏 9415

关于RxJava2.x的学习笔记

花了一段时间学习rxJava,有关于1.x版本的和2.x版本的,主要看的还是2.x版本。 下面将我主要看的两篇文章进行了整合,除了相当于为自己整合一下,也可以让我更加熟悉里面一些操作的用法。 两篇文章的原地址分别是: 1、这可能是最好的RxJava 2.x 入门教程系列(主要讲的RxJava2.x) 2、给 Android 开发者的 RxJava 详解(主要讲的RxJava1.x) 有兴...

asjqkkkk的博客 385

Retrofit2+RxJava+Okhttp学习笔记

刚刚上班,公司的事情不多,就决定多学习点东西,于是在掘金上发现去年一年最流行的网络框架则是Retrofit2+RxJava+Okhttp,突然觉得自己Out了,于是开始了学习,对自己的学习心得给大家分享。 一看这个框架,发现自己平日里除了用了Okhttp其它两个在此之前并没有任何了解,于是我第一反应就是去学习Retrofit2关于Retrofit2的学习心得如下: Retrofit 使用方

qq_21320997的博客 217

RXJava学习笔记(2)

变换操作通过上篇的学习,我们知道了如何去创建一个Observable对象,通过subscribe将事件传递给Observer,但是仅仅知道这些是不够的,有些复杂的场景,需要我们对Observable进行一些转换来发射数据。那么我们就在这篇文章里来系统的学习一下吧

r17171709的专栏 654
上一篇: 读《PathMeasure之迷径追踪》相关笔记
下一篇: Android LayoutInflater 相关笔记
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值