当前位置: 代码迷 >> 综合 >> RxJava—学习笔记
  详细解决方案

RxJava—学习笔记

热度:49   发布时间:2023-12-14 00:40:56.0

在这里插入图片描述
快速学习与上手,建议是进行归纳分类,学习后实践,过半个月再来检索一下,对自己不太熟悉的模块再次深入学习,反复如此,直到深入掌握各个模块,大功告成。
归纳分类后,我感觉1周或者几天,就应该能掌握吧… …
然后 每周再 回想/检索 或 实战中 自己哪里没有掌握,再学习(可以查资料,看视频,深入)…反复如此,这叫做 后刻意练习 学习方法…

Observable ( 被观察者 ) / Observer ( 观察者 )
Flowable (被观察者)/ Subscriber (观察者)

Observable: 被观察者
Observer: 观察者
Subscribe: 订阅
Disposable: 断连。在类出现的函数中加入d.dispose()这一段代码,就能够让连接断开。
Transformer:转换器,将 Observable/Flowable/Single/Completable/Maybe 对象 转换成另一个 Observable/Flowable/Single/Completable/Maybe 对象
compose:

Observable 被观察者(顾客) -> Subscribe 订阅者(服务员) -> Observer 观察者(厨师)

线程操作

在这里插入图片描述
调度器(Scheduler)

线程切换函数 概述
Schedulers.single 1个线程池,重复利用
Schedulers.immediate() 当前线程 = 不指定线程
AndroidSchedulers.mainThread() Android主线程, 操作UI
Schedulers.newThread() 常规新线程 , 耗时等操作
Schedulers.io() io操作线程 , 网络请求、读写文件等io密集型操作
Schedulers.computation() CPU计算操作线程 , 大量计算操作,固定的线程池,大小为CPU核数,CPU密集型计算

Schedulers.from 转换一个调度实例

subscribeOn:多次执行,只有一次会生效
observeOn:多次执行,线程可以一直切换

如果想多次切换,这么办?弄一个DEMO举一反三:

Observable.just("冰雪").observeOn(Schedulers.newThread()).map(new Function<String, String>() {
    @Overridepublic String apply(final String s) throws Exception {
    System.out.println("test-1:" + Thread.currentThread().getName() + " s:" + s);return s + "情";}}).observeOn(Schedulers.io()).map(new Function<String, String>() {
    @Overridepublic String apply(final String s) throws Exception {
    System.out.println("test-2:" + Thread.currentThread().getName() + " s:" + s);return s + "缘long";}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {
    @Overridepublic void accept(final String s) throws Exception {
    System.out.println("test-3:" + Thread.currentThread().getName() + " s:" + s);}});

输出结果:
test-1:RxNewThreadScheduler-1 s:冰雪
test-2:RxCachedThreadScheduler-1 s:冰雪情
test-3:main s:冰雪情缘long

背压

背压(被观察者发送事件速度快于观察者处理的速度,导致下游buffer溢出)只有异步的场景下使用,被观察者与观察者处于不同线程中。

Flowable: 也就是背压的实现类
Subscriber: 订阅,和Observer差不多,但是多了一些适配Flowable的功能
BackpressureStrategy: 着重讲解。

BackpressureStrategy背压策略

策略名称 概述
MISSING 提示缓存区已满
ERROR 默认模式,数据超出缓存的128时,抛出异常
BUFFER 无限缓存,可能会OOM
DROP 超出128时进行丢弃后面进来的数据
LATEST 超出128时进行丢弃最开始进来的数据

操作符

创建操作符:https://www.jianshu.com/p/e19f8ed863b1

变换操作符

Observable发射的相关东西变化为新的Observables的东西.
map(),flatMap(),concatMap
变换操作符:https://www.jianshu.com/p/904c14d253ba

// map()
Observable.just("HAI").map(new Function<String, String>() {
    @Overridepublic String apply(final String s) throws Exception {
    return s + "LONG";}}).map(new Function<String, String>() {
    @Overridepublic String apply(final String s) throws Exception {
    return s + "Qiu";}}).subscribe(new Consumer<String>() {
    @Overridepublic void accept(final String s) throws Exception {
    System.out.println(s);}});

输出结果:HAILONGQiu

// flatMap
Data data = new Data();data.strs.add("天府新区");data.strs.add("高新区");data.strs.add("武侯区");Observable.just(data).flatMap(new Function<Data, ObservableSource<String>>() {
    @Overridepublic ObservableSource<String> apply(final Data data) throws Exception {
    return Observable.fromIterable(data.strs);}}).subscribe(new Consumer<String>() {
    @Overridepublic void accept(final String s) throws Exception {
    System.out.println(s);}});

输出结果:
天府新区
高新区
武侯区

过滤操作符

过滤操作符:https://www.jianshu.com/p/c3a930a03855

Observable.just("冰雪情缘", "Android TV", "冰雪情缘long", "Android Studio", "冰雪情缘TV", "冰雪奇缘").filter(new Predicate<String>() {
    @Overridepublic boolean test(final String s) throws Exception {
    return s.contains("冰雪");}}).subscribe(new Consumer<String>() {
    @Overridepublic void accept(final String s) throws Exception {
    System.out.println(s);}});

输出的结果:
冰雪情缘
冰雪情缘long
冰雪情缘TV
冰雪奇缘

组合/合并操作符

https://www.jianshu.com/p/c2a7c03da16d

Observable<String> oneObservable = Observable.just("hai", "long", "qiu");Observable<String> twoeObservable = Observable.just("冰", "雪", "情", "缘");Observable.merge(oneObservable, twoeObservable).subscribe(new Consumer<String>() {
    @Overridepublic void accept(final String s) throws Exception {
    System.out.println("accept s:" + s);}});

输出结果:
accept s:hai
accept s:long
accept s:qiu
accept s:冰
accept s:雪
accept s:情
accept s:缘

功能操作符

https://www.jianshu.com/p/b0c3669affdb

条件/布尔操作符

条件/布尔操作符:https://www.jianshu.com/p/954426f90325

// all,所有字符串不满足函数的条件(是否包含"冰雪")
Observable.just("冰雪情缘", "Android TV", "Android Studio", "冰雪情缘TV").all(new Predicate<String>() {
    @Overridepublic boolean test(final String string) throws Exception {
    System.out.println("all test:" + string);return string.contains("冰雪");}}).subscribe(new Consumer<Boolean>() {
    @Overridepublic void accept(final Boolean aBoolean) throws Exception {
    System.out.println("accept Boolean:" + aBoolean);}});

输出结果:
all test:冰雪情缘
all test:Android TV
accept Boolean:false

上面的代码,也可以使用 contains 条件操作符

 Observable.just("冰雪情缘", "Android TV", "Android Studio", "冰雪情缘TV").contains("冰雪").subscribe(new Consumer<Boolean>() {
    @Overridepublic void accept(final Boolean aBoolean) throws Exception {
    System.out.println("accept Boolean:" + aBoolean);}});

推荐资料

RxBinding

okhttp-RxHttp

《RxJava 2.x 实战》,《RxJava响应式编程》