美文网首页
Rxjava响应式编程

Rxjava响应式编程

作者: vb12 | 来源:发表于2018-11-23 13:22 被阅读46次

    相应式编程

    https://www.jianshu.com/p/c95e29854cb1](https://www.jianshu.com/p/c95e29854cb1
    https://www.jianshu.com/p/2d3d7c77dc92
    "给 Android 开发者的 RxJava 详解 -- 扔物线" https://gank.io/post/560e15be2dca930e00da1083
    "RxJava2 浅析" --泡在网上的日子 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0907/6604.html

    给初学者的RxJava2.0教程系列

    https://www.jianshu.com/p/464fa025229e

    学习操作符

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

    image.png
    我在想, 这么多的操作符, 到底要不要学... kotlin,java是可以在语言中内置这些功能的.
    不过好在绝大多数操作符都是很直接的, 看一遍介绍就知道什么意思.

    https://www.jianshu.com/p/6fd8640046f1 --关于RxJava最友好的文章
    https://www.jianshu.com/p/220955eefc1f -- 关于 RxJava 最友好的文章—— RxJava 2.0 全新来袭

    重点概念

    1. subscribeOn, observeOn 两者对线程执行的指定, 这个是面试时常问的内容.
      subscribeOn、observeOn操作符使用的代码如下所示:

                Observable.just("当前的线程ID为" + Thread.currentThread().getName())
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(onNextAction);       
      

      subscribeOn操作符,指定subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程。
      observeOn操作符,指定Subscriber所运行的线程。或者叫做事件消费的线程。

    Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
        .subscribeOn(Schedulers.io()) // subscribeOn只有第一次有效, 再多也只有第一次有效, 位置不一定非在这里
        .observeOn(Schedulers.newThread())
        .map(mapOperator) // 新线程,由 observeOn() 指定
        .observeOn(Schedulers.io())
        .map(mapOperator2) // IO 线程,由 observeOn() 指定
        .observeOn(AndroidSchedulers.mainThread) 
        .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定
    

    为什么subscribeOn这种设置, 及时后面设置多少次, 感觉管用的只有第一次?
    .subscribeOn(Schedulers.single())
    .subscribeOn(Schedulers.computation())

    其实后面的设置也管用, 只是一层一层的包括起来, 每一层都封装为一个Observable对象.
    最终执行时, 就是从最外层开始执行每个Observable的subscribeActual()方法.
    所以后来设置的subscribeOn, 也就是外层的Observable, 都不会执行实际的业务逻辑, 都会一层层的调用内部的名为source的Observable实例, 最终还是会调用第一次设置subscribeOn所对应的Observable, 这个Observable执行的时候就是在其指定的线程中执行. 简单来说这个最内层的Observable不受外层Observable的影响.

    那为什么observeOn() 生效的是最后一个呢?
    因为逻辑不同, 每调用一次, 也是新创建一层Observable, 这是一致的.
    但是这里创建的Observable, 具体是ObservableObserveOn, 其逻辑比较特殊, 在其subscribeActual()方法中会这样:


    image.png

    只看else分支.
    先创建一个线程工作者, 然后让其内一层的source 继续执行subscribe
    于是责任交给了这里创建的对象:new ObserveOnObserver<T>(observer, w, delayError, bufferSize)

    这里的ObserveOnObserver 它的onSubscribe()中会启动一个运行队列, 并且是交给observeOn()时指定的线程运行的. 这个任务队列的目的就是等待结果数据, 并把结果数据交给downstream变量, 这个downstream变量就是初始的Observer对象. 所以就达到了目的, 对初始Observer对象的调用, 比如onNext() onComplete() onError() 都是在指定的线程上.
    同样, 不管内部,或者说内层指定了多少次observeOn() 其最终生效的是最外层的那个, 因为这个任务队列是直接操作初始Observer的, 其他都是类似代理, 或者委托的方式, 一层一层向外调用.

    Schedulers可以使得RxJava实现线程切换,实质上就是借助于lift变换方法进行转换,subscribeOn发生在下图的通知过程,observeOn发生在下图中的发送过程。


    image.png
    1. lift 概念
      具体参看https://gank.io/post/560e15be2dca930e00da1083里的描述吧.

    2. RxBus
      先要明白, RxBus并不是那么的受大神待见, 在他看来就是换了种方式开倒车
      https://www.jianshu.com/p/61631134498e
      不过如果真的要实现, 可以参考如下:
      https://www.jianshu.com/p/2a8f9ac32e13

    缺点

    1. 代码侵入性.
      不光是编译依赖的侵入性, 还包括对代码风格的影响或者说破坏. android本身代码并不是流式调用风格, 使用了rxjava之后, 很多地方看起来很突兀. 格格不入.

    相关文章

      网友评论

          本文标题:Rxjava响应式编程

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