美文网首页
Rxjava2技术分享

Rxjava2技术分享

作者: Yasin27878 | 来源:发表于2018-12-14 14:13 被阅读3次

    1. 为什么要升级Rxjava2

    1. 兼容Reactive Streams规范 官网

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

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

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

    3. 拥有比Rxjava1更好的性能

    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

    相关文章

      网友评论

          本文标题:Rxjava2技术分享

          本文链接:https://www.haomeiwen.com/subject/plhghqtx.html