1. 为什么要升级Rxjava2
1. 兼容Reactive Streams规范 官网
Reactive Streams 是一种为异步流处理提供非阻塞压力的标准。
2. 更好的处理BackPressure的情况--- Flowable
背压,即生产者的速度大于消费者的速度带来的问题
使用Flowable我们需要定义它的事件处理策略(缓存,丢弃,报错)
3. 拥有比Rxjava1更好的性能
image2 .Rxjava1到Rxjava2有哪些变化
1.Nulls
这是一个很大的变化,熟悉 RxJava 1.x 的童鞋一定都知道,1.x 是允许我们在发射事件的时候传入 null 值的
,但现在 2.x 不支持了,直接抛 NullPointerException 。
2. Observable->Observable,Flowable
1.)基本对比
- rxjava1的Observable支持背压 通过.onBackpressureXXX使得支持背压 订阅关系 Observable subscribe Observer(new Acition1)
- rxjava2的Observable不支持背压 他的订阅关系Observable->subscribe ->Observer(new Consumer)
- rxjava2 的为了支持背压 订阅关系 Flowable->subscribe->Subscriber(new Consumer)
2.)发射世界和接收事件满足的条件
- 上游可以发送无限个onNext, 下游也可以接收无限个onNext.
- 当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
- 当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
- 上游可以不发送onComplete或onError.
- 最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然
3.调度器的变化
- Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
- Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
- Schedulers.newThread() 代表一个常规的新线程
- Scheduiers.trampoline() 代表不是立即执行而是加入到队列它是repeat()和retry()的默认调度器
- Schedulers.immediate() 代表在当前线程操作(2.X 取消)
- AndroidSchedulers.mainThread() 代表Android的主线程
4.Function相关
在1.x 中是有 Func1,Func2.....FuncN的,但 2.x 中将它们移除,而采用 Function 替换了 Func1,采用 BiFunction 替换了 Func 2..N。并且,它们都增加了 throws Exception,也就是说,不用担心我们做某些操作还需要 try-catch 了。
5. 观察者的接口实 Observer对比Subscriber
Observer(rx1) Subscription CompositeSubscription
- void onNext(Object o)
- void onError(Throwable e)
- void onCompleted();
Subscriber(rx2) Disposable CompositeDisposable
- void onSubscribe(Disposable s)
- void onNext(Object o)
- void onError(Throwable t)
- void onComplete()
3.Rxjava2中一些强大功能和应用场景
- 采用 concat 操作符先读取缓存再通过网络请求获取数据
- 利用 concat 的必须调用 onComplete 后才能订阅下一个 Observable 的特性
- 使用 flatMap 实现多个网络请求依次依赖
- flatMap 操作符可以将一个发射数据的 Observable 变换为多个 Observables ,然后将它们发射的数据合并后放到一个单独的 Observable
- 使用 zip 操作符,实现多个接口数据共同更新 UI
- zip 操作符可以将多个 Observable 的数据结合为一个数据源再发射出去
- 采用 interval 操作符实现心跳间隔任务
- interval就是轮训
- 使用debounce操作符,实现现需操作放过滤不必要的消息
- debounce可以指定一段时间内仅第一次发出的消息有效
想必即时通讯等需要轮训的任务在如今的 APP 中已是很常见,而 RxJava 2.x 的 interval 操作符可谓完美地解决了我们的疑惑。
- debounce可以指定一段时间内仅第一次发出的消息有效
- retryWhen操作符实现错误重试机制
- retryWhen可以在错误发生时指定重试次数以及间隔
4.RxJava1.x 如何平滑升级到RxJava2.x?
由于RxJava2.x变化较大无法直接升级,幸运的是,官方开发者提供了RxJava2Interop这个库,可以方便地将RxJava1.x升级到RxJava2.x,或者将RxJava2.x转回RxJava1.x。地址:https://github.com/akarnokd/RxJava2Interop
网友评论