观察:
此方法只需在下游更改所有运算符的线程
(https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a)
调用api时,我希望在io线程上运行与服务器的通信,并希望在mainthread上处理结果。
我在许多教程中看到了下面的代码,毫无疑问它是正确的。
但我的理解是相反的,所以我想知道我误解了什么。
requestInterface.callApi()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe())
观察(androidSchedulers.mainThread())
:observeon将所有运算符的线程更改到更下游的位置,但在示例中,实际调用的api函数高于observeon?
.subscribeOn(schedulers.io())
:奇怪的是,它需要在主线程上订阅,但在IO线程上订阅?
请告诉我我误解了什么?
最佳答案
基本的,我们会有
Observable.subscribe(Observer);// => Observer observe Observable and Observable subscribe Observer
例子
requestInterface.callApi().subscribe(new Observer...); // requestInterface.callApi() <=> Observable
从http://reactivex.io/documentation/operators/subscribeon.html
订阅
subscribeon运算符指定可观察对象将在哪个线程上开始操作,无论该运算符在运算符链中的哪个点被调用
观察(影响2件事)
它指示Observable向指定调度程序上的观察者发送通知。
observeon会影响observeable将在下面该运算符出现的位置使用的线程
例子
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())
});