前言
每个 Android 开发者, 都是爱 RxJava 的, 简洁线程切换和多网络请求合并, 再配合 Retrofit, 简直是 App 开发的福音. 不知不觉, RxJava 一路走来, 已经更新到第三大版本了. 不像 RxJava 2 对 RxJava 1 那么残忍, RxJava 3 对 RxJava 2 的兼容性还是挺好的, 目前并没有做出很大的更改. RxJava2 到 2020 年 12 月 31 号不再提供支持, 错误的会同时在 2.x 和 3.x 修复, 但新功能只会在 3.x 上添加.
同时, 希望通过本文, 能知道垃圾箱颜色分类.
作为尝鲜, 赶紧品尝吧.
主要变化
主要特点
单一依赖: Reactive-Streams
继续支持 Java 6 + 和 Android 2.3+
修复了 API 错误和 RxJava 2 的许多限制
旨在替代 RxJava 2, 具有相对较少的二进制不兼容更改
提供 Java 8 lambda 友好的 API
关于并发源的不同意见
异步或同步执行
参数化并发的虚拟时间和调度程序
为测试 schedulers,consumers 和 plugin hooks 提供测试和诊断支持
与 RxJava 2 的主要区别是:
将 eagerTruncate 添加到 replay 运算符, 以便 head 节点将在截断时丢失它保留的项引用
新增 X.fromSupplier()
使用 Scheduler 添加 concatMap, 保证 mapper 函数的运行位置
新增 startWithItem 和 startWithIterable
ConnectableFlowable/ConnetableFlowable 重新设计
将 as() 并入 to()
更改 Maybe.defaultIfEmpty() 以返回 Single
用 Supplier 代替 Callable
将一些实验操作符推广到标准
从某些主题 / 处理器中删除 getValues()
删除 replay(Scheduler) 及其重载
删除 dematerialize()
删除 startWith(T|Iterable)
删除 as()
删除 Maybe.toSingle(T)
删除 Flowable.subscribe(4 args)
删除 Observable.subscribe(4 args)
删除 Single.toCompletable()
删除 Completable.blockingGet()
入门
1, 添加依赖
implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC0"
不好意思哦, 还没看到 RxAndroid 出 3.0, 这就很尴尬了...
2, 一些概念
2.1, 上流, 下流
在 RxJava, 数据以流的方式组织. 也就是说, Rxjava 包括一个源的数据流, 数据流后跟着消费者的零个到多个消费数据流步骤.
- source
- .operator1()
- .operator2()
- .operator3()
- .subscribe(consumer)
在上文代码中, 对于 operator2 来说, 在它前面叫做上流, 在它后面的叫做下流. 憋住, 别笑, 真的是下流来的.
2.2, 流的对象
在 RxJava 的文档中, emission, emits, item, event, signal, data and message 都被认为在数据流中被传递的数据对象.
2.3, 背压(Backpressure)
当数据流通过异步的步骤执行时, 这些步骤的执行速度可能不一致. 也就是说上流数据发送太快, 下流没有足够的能力去处理. 为了避免这种情况, 一般要么缓存上流的数据, 要么抛弃数据. 但这种处理方式, 有时会带来很大的问题. 为此, RxJava 带来了 backpressure 的概念. 背压是一种流量的控制步骤, 在不知道上流还有多少数据的情形下控制内存的使用, 表示它们还能处理多少数据.
支持背压的有 Flowable 类, 不支持背压的有 Observable,Single, Maybe and Completable 类.
2.4 线程调度器(Schedulers)
对于我们 Android 开发来说, 最喜欢的就是它简洁切换线程的操作. RxJava 通过调度器来方便线程的切换.
Schedulers.computation(): 适合运行在密集计算的操作, 大多数异步操作符使用该调度器.
Schedulers.io(): 适合运行 I/0 和阻塞操作.
Schedulers.single(): 适合需要单一线程的操作
Schedulers.trampoline(): 适合需要顺序运行的操作
在不同平台还有不同的调度器, 例如 Android 的主线程: AndroidSchedulers.mainThread()
- Flowable.range(1, 10)
- .observeOn(Schedulers.computation())
- .map(v -> v * v)
- .blockingSubscribe(System.out::println);
2.5 基类
在 RxJava 3 可以发现有以下几个基类(跟 RxJava 2 是一致的吧):
io.reactivex.Flowable: 发送 0 个 N 个的数据, 支持 Reactive-Streams 和背压
io.reactivex.Observable: 发送 0 个 N 个的数据, 不支持背压,
io.reactivex.Single: 只能发送单个数据或者一个错误
io.reactivex.Completable: 没有发送任何数据, 但只处理 onComplete 和 onError 事件.
io.reactivex.Maybe: 能够发射 0 或者 1 个数据, 要么成功, 要么失败.
来源: http://www.jianshu.com/p/ea840237090d