observeOn:
此方法只是更改下游所有操作符的线程
(https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a)
在调用API时,我想在IO线程上运行与服务器的通信,并希望在mainThread上处理结果.
我在许多教程中看到了下面的代码,毫无疑问它是正确的.
但我的理解是相反的,所以我想知道我误解了什么.
requestInterface.callApi()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe())
observeOn(AndroidSchedulers.mainThread())
:observeOn更改下游所有操作符的线程,但在本例中,实际调用API函数是否高于observeOn?
.subscribeOn(Schedulers.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
- SubscribeOn operator designates which thread the Observable will begin operating on, no matter at what point in the chain of operators that operator is called
ObserveOn(影响2件事)
It instructs the Observable to send notifications to Observers on a specified Scheduler.
ObserveOn affects the thread that the Observable will use below where that operator appears
例
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())
});