用法很简单,但直播系统源代码有点复杂,这里为了模拟多次subscribeOn和observeOn,给Observable这个类新增了两个方法和两个类,便于分析调试。
不看源码,还真不知道,以为直播系统源代码的链式调用肯定通过Builder设计模式实现,其实Rxjava不是,仅仅Observable这个类就有15000+的代码。链式调用采用装饰器设计模式实现,除了最后的订阅,每次链式调用一次,都套娃一次。 我们上面的Observable最后一次链式调用是ObserveOn2,那最终的Observable就是ObservableObserveOn2。将ObservableOnSubscribe称之为 伪Observable,因其就只有一个subscribe方法,跟其他Observable不一样,ObservableOnSubscribe的subscribe方法可用于发射数据(调用观察者observer的onNext、onComplete、onError)等。
ps: 都知道Observable套娃了,那它对应的observer套娃了吗?也套娃了。
observable就是ObservableObserveOn2,observeOn2的调用是切换到直播系统源代码主线程。
先看其subscribe方法。
参数observer就是用户observer,进来之后,被ObserveOnObserver2封装了下,而且把调度器、buffersize(128)也加进去了。这里切换安卓主线程的功能是来自JakeWharton的RxAndroid库(专为Rxjava适配安卓用),先看下HandlerWorker。
2.1.1、Rxjava是如何切换到主线程的?
兄弟们,这里直播系统源代码线程切换就是用的handler。但是Runnalb是谁,不用猜,肯定是ObserveOnObserver2,这样就可以在他的onNext、onComplete、onError先经过Handler的切换线程,然后分发给用户observer。
当onNext被触发的时候,worker.schedule(this),直播系统源代码执行线程切换,然后handler处理message时,就走run方法,这里会走drainNormal(测试时发现,连续多个observeOn调用,前面的几个observeOn都是走drainFused,只有最后一个drainNormal),然后下发给下游observer,这里就是用户observer, 所以用户observer的onNext、onComplete、onNext方法所在的线程,只与距离它最近的observeOn方法中设置的线程有关。 但是用户observer的onSubscribe方法所在的线程在哪里决定?后面告知。
2.1.2、继续ObservableObserveOn2的subscribeActual
同样也是先 subscribe(observer) --> subscribeActual(observer)
map主要的操作
map的操作就太简单了,将apply方法的返回值作为onNext链中的新值,往下传递。
ObserveOnObserver构造传入的Worker是IoScheduler的EventLoopWorker。不用太care,io线程池,还能有啥,一般都是核心线程数量和max的线程数量一样,都等于cpu的数量即可。但是Rxjava不是这么处理的,稍复杂,这里不讨论。就只看成线程池提交任务处理即可。ps: 线程池处理的是其下游的observer的onNext、onComplete、onError,不是当前ObserveOnObserver的。 与之前说的:用户observer的onNext由距离它最近的observeOn设置的线程决定,同理。
现在转到subscribeOn了,跟之前observeOn不一样。
先看subscribeActual方法中observer.onSubscribe(parent),这里 observer是ObserveOnObserver 这么快这个下游的onSubscribe被执行了,一直以为是从最里层ObservableCreate方法的subscribeActual调用Observer的onSubscribe开始呢,实际上距离ObserveOn最近的一个subscribeOn就开始调用下游的onSubscribe了。
2.4.1、ObserveOnObserver.onSubscribe
这里的d就是SubscribeOnObserver2,他不是QueueDisposable类型,所以这里会继续调用下游的onSubscribe。ObserveOnObserver的下游是MapObserver。
这里MapObserver是个QueueDisposable,也会调用下游的onSusbcribe,MapObserver的下游是ObserveOnObserver2。
这里ObserveOnObserver2就调用用户observer的onSubscribe了。
总结一下用户observer的onSusbcribe的调用过程
那用户observer的onSubscribe回调了,请问它处在哪个线程?
就是Rxjava发起订阅所在的线程。
又看到了source.subscribe(parent),此时说明subscribeOn2(schedulers.IO)决定了 ObservableSubscribeOn.subscribe(subscribeOnObserver2)方法执行的线程 ,真的是厉害哦。
从subscribe(observer)---->subscribeActual(observer)
observer.onSubscribe(parent),表示subscribeOnObserver2的onSubscribe被调用。
就只是给subscribeOnObserver2的upstream字段设置值为subscribeOnObserver,所以subscribeOnObserver2的上游是subscribeOnObserver,下游是从构造传入的,为observeOnObserver。
这里的Schedulers.computation()就简单看成是computation线程池执行任务
source.subscribe(parent) 就行, 表明subscribeOn(Schedulers.computation())决定了
ObservableCreate.subscribe(subscribeOnObserver)方法执行的线程。
从subscribe(observer)---->subscribeActual(observer)
使用subscribeOnObserver创建了CreateEmitter。
subscribeOnObserver调用onSubscribe(parent),设置上游observer为createEmitter
source.subscribe(parent),这里的source就是那个伪Observable(ObservableOnSubscribe)。
这里终于看到了emitter的onNext调用,前面提到Schedulers.computation()决定了这里的subscribe方法执行的直播系统源代码线程。
observer.onNext直接就是subscribeOnObserver的onNext调用了
downstream.onNext直接就是subscribeOnObserver2的onNext调用了
downstream.onNext直接就是observeOnObserver的onNext调用了,onNext此时所在的线程还是computation线程。
同样也是直播系统源代码将数据往下游分发,observeOnObserver下游的mapObserver, 它的onNext将会在IO线程。
mapObserver的onNext只是将数据做个简单的处理,然后继续下游分发数据。
mapObserver的下游observeOnObserver2的onNext方法继续分发数据。
跟之前的observeOnObserver一样代码,此时observeOnObserver2的onNext跟MapObserver的onNext是在同一个线程,都是在io线程执行,observeOnObserver2的下游就是用户observer了,在这里经过主线程代码切换后,用户observer的onNext的方法就在主线程成执行了。
有人说多次subscribeOn,只有第一次生效,其实每次都生效。
每次subscribeOn设置线程都会对它
source Observable的subscribe方法(或者subscribeActual)产生影响。
每次observeOn设置线程都会对它
下游的Observer的onNext、onComplete、onError产生影响。
| 被观察者 | subscribe方法 | 观察者 | onSubscribe方法 | onNext/onComplete/onError方法 |
|---|---|---|---|---|
| 伪Observable | computation线程 | CreateEmitter | - | computation线程 |
| ObservableCreate | computation线程 | CreateEmitter | - | computation线程 |
| ObservableSubscribeOn | io线程 | SubscribeOnObserver | computation线程 | computation线程 |
| ObservableSubscribeOn2 | 用户线程 | SubscribeOnObserver2 | io线程 | computation线程 |
| ObservableObserveOn | 用户线程 | ObserveOnObserver | 用户线程 | computation线程 |
| ObservableMap | 用户线程 | MapObserver | 用户线程 | io线程 |
| ObservableObserveOn2 | 用户线程 | ObserveOnObserver2 | 用户线程 | io线程 |
| - | - | 用户observer | 用户线程 | 主线程 |
ps:用户线程就是指observable.subscribe(observer)代码调用的线程。 CreateEmitter不是观者者,没有继承Observer,它只是含有onNext、onComplete、onError方法而已。
声明:本文由云豹科技转发自信仰年轻博客,如有侵权请联系作者删除
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70002045/viewspace-2794968/ ,如需转载,请注明出处,否则将追究法律责任。