在上一篇我们已经介绍了线程切换两大操作符中的subscribeOn了,这一片我们来分析一下observerOn。本文重点是:
(1)observeOn是如何实现的,它是如何影响事件流的,
(2)如果我们使用多次会是什么结果,为什么?
(3)subscribeOn和observeOn的混合使用效果
如果对整体流程还不清晰的最好先去看看前面两篇:
RxJava2.1.14源码学习(一)基本流程(附带装饰者模式、观察者模式说明)
RxJava2.1.14源码学习(二)线程切换subscribeOn
单个ObserveOn
先从单个observeOn开始吧,下面是示例代码和结果:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
LogUtils.e(TAG, "subscribe:" + Thread.currentThread().getName());
emitter.onNext(1 + "");
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
LogUtils.e(TAG, "onSubscribe:" + Thread.currentThread().getName());
}
@Override
public void onNext(String result) {
//收到的值类型发生变化
LogUtils.e(TAG, "onNext:" + Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
LogUtils.e(TAG, "onError:" + Thread.currentThread().getName());
}
@Override
public void onComplete() {
LogUtils.e(TAG, "onComplete:" + Thread.currentThread().getName());
}
});
发现除了subscribe
,其它都是在主线程。前面的流程就不在分析了,我们从observeOn开始,我们猜测应该是新建了一个ObservableObserveOn
类,然后里面的重点是重写的subscribeActual
,去看一下:
@Override
protected void subscribeActual(Observer<? super T> observer) {