本文主要说我们为什么要升级Rxjava2,以及升级Rxjava2的好处

1. 为什么要升级Rxjava2

1. 兼容Reactive Streams规范 官网

Reactive Streams 是一种为异步流处理提供非阻塞压力的标准。

2. 更好的处理BackPressure的情况— Flowable

 背压,即生产者的速度大于消费者的速度带来的问题
使用Flowable我们需要定义它的事件处理策略(缓存,丢弃,报错)

3. 拥有比Rxjava1更好的性能

image
image

2 .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 操作符可谓完美地解决了我们的疑惑。
  • retryWhen操作符实现错误重试机制
    • retryWhen可以在错误发生时指定重试次数以及间隔

4.RxJava1.x 如何平滑升级到RxJava2.x?

由于RxJava2.x变化较大无法直接升级,幸运的是,官方开发者提供了RxJava2Interop这个库,可以方便地将RxJava1.x升级到RxJava2.x,或者将RxJava2.x转回RxJava1.x。地址:https://github.com/akarnokd/RxJava2Interop