翻新中的Rxjava watchOn和subscribeOn

Exp*_* be 6 android retrofit2 rx-java2

watchOn:此方法只是简单地将所有运算符的线程更改为更下游(https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a

调用API时,我想在IO线程上运行与服务器的通信,并想在mainThread上处理结果。

我在许多教程中都看到了下面的代码,毫无疑问,它是正确的。但是我的理解是相反的,所以我想知道我的误解。

requestInterface.callApi()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe())
Run Code Online (Sandbox Code Playgroud)

watchOn(AndroidSchedulers.mainThread())

:observeOn将所有运算符的线程进一步向下游移动,但是在示例中,实际的调用API函数是否高于observeOn?

.subscribeOn(Schedulers.io())

:奇怪的部分,它需要在主线程上订阅,但是在IO线程上订阅?

请告诉我我误会什么?

Pha*_*inh 5

基本,我们将有

Observable.subscribe(Observer);// => Observer observe Observable and Observable subscribe Observer
Run Code Online (Sandbox Code Playgroud)

requestInterface.callApi().subscribe(new Observer...); // requestInterface.callApi() <=> Observable
Run Code Online (Sandbox Code Playgroud)

http://reactivex.io/documentation/operators/subscribeon.html

SubscribeOn

  • SubscribeOn运算符指定Observable将在哪个线程上开始操作,无论该运算符在运算符链中的哪个点被调用

ObserveOn(影响2件事)

  • 它指示可观察对象将通知发送到指定调度程序上的观察者

  • ObserveOn影响Observable将在该运算符出现的位置使用的线程

registerUserReturnedObserverble()  // run on worker thread because subscribeOn(Schedulers.io()) (line 5)
.andThen(loginReturnObserverble()) // run on worker thread because subscribeOn(Schedulers.io()) (line 5)
.observeOn(AndroidSchedulers.mainThread())
.andThen(getUserDataReturnObserverble()) // run on main thread because .observeOn(AndroidSchedulers.mainThread()) is above this operator (line 3)
.subscribeOn(Schedulers.io())
.subscribe(new Observer<Void>{
    // run on main thread because observeOn(AndroidSchedulers.mainThread()) 
});
Run Code Online (Sandbox Code Playgroud)