- 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())*
:奇怪的是,它需要在主线程上订阅,但在IO线程上订阅?
请告诉我我误解了什么?
4条答案
按热度按时间aoyhnmkz1#
基本的,我们将有
示例
从http://reactivex.io/documentation/operators/subscribeon.html
示例
apeeds0o2#
aiqt4smr3#
下面是一个示例:
**subscribeOn -->**执行调用的线程,类似于调用asynctask
**observeOn -->**其中响应将在UI线程的进程中被观察
**subscribe -->**观察者回调
nnvyjq4y4#
以下情况指定了使用observeOn()和/或subscribeOn()时可能出现的所有不同情况。
subscribeOn
影响上游运算符(subscribeOn之上的运算符)observeOn
影响下游运算符(observeOn下面的运算符)1.如果你没有在RxJava中指定线程(如果你没有指定
subscribeOn
,observeOn
或两者),数据将由当前的调度器/线程(通常是主线程)发出和处理。例如,下面链中的所有运算符都将由当前线程(Android的主线程)处理。1.如果只指定了subscribeOn,则将在该线程上执行所有运算符
仅数据发射,Map和过滤操作符将在io调度器上执行,如上游操作符
subscribeOn
所指示的。1.如果只指定了
observeOn
,则所有运算符都将在当前线程上执行,只有observeOn
以下的运算符才会切换到observeOn
指定的线程数据发射,Map将在currentThread调度器上执行。
filter将在计算调度器上执行,如下游运算符
observeOn
所指示的。1.如果同时指定了
subscribeOn
和observeOn
,则observeOn
以下的所有运算符将切换到observeOn
指定的线程,其余observeOn
以上的运算符将切换到subscribeOn
指定的线程。无论指定subscribeOn
和observeOn
的顺序如何,这都是正确的数据发射和Map操作符将在io调度器上执行,如上游操作符
subscribeOn
所指示的。filter将在计算调度器上执行,如下游运算符
observeOn
所指示的。即使subscribeOn在observeOn之后被调用,线程的使用也是相同的。