Rxjava响应式编程

相应式编程

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之后, 很多地方看起来很突兀. 格格不入.

推荐阅读更多精彩内容

  • 尽道天堂美,仙如何下凡。 偏缠穷汉配,逼迫不甘还。
    云岭古松阅读 15评论 0 3
  • 关于控制。 那种特别有主意,遇事情马上就有自己想法的人。他们的那种控制很容易被看见。也很容易招致反感。大家都觉得这...
    可可儿妈阅读 15评论 0 0
  • 昨日,与一位多年不见的老友相会,喝茶聊天。他是日本人,我在国外时的好友,目前在日本东京大学做考古学的教学和研究。这...
    老麦Michael阅读 36评论 0 0
  • 钱钟书说婚姻就像一座围城,里面的人想出来,外面的人想进去。其实,也可以类比很多方面。比如,你所从事的职业。 拿我而...
    晓鸿Iris阅读 17评论 0 0
  • 子承父业,开创泛华新天地。这是一个两代人创业的真实故事,十二年前,刘标因为梦想放弃平安营业部高级经理的职务,加入泛...
    泛小金阅读 52评论 0 0