首页 文章

Rxjava observeOn和subscribeOn在Retrofit中

提问于
浏览
4

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线程上订阅?

请告诉我我的误解是什么?

3 回答

  • 0

    基本,我们会有

    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运算符指定Observable将开始运行的线程,无论运算符链中的哪个运算符被调用

    ObserveOn (影响2件事)

    它指示Observable在指定的Scheduler上向Observers发送通知 . 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()) 
    });
    
  • 3

    这是一个示例:

    getCardsObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new rx.Observer<List<Card>>() {
                    @Override
                    public void onCompleted() {
    
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        listener.onError(e.getMessage());
                    }
    
                    @Override
                    public void onNext(List<Card> cards) {
                        listener.onSuccess(cards);
                    }
                });
    

    subscribeOn - >调用将执行调用的线程类似于调用asynctask observeOn - >其中响应将被观察到进程的ui线程

    subscribe - >观察者回调

  • 0
    • subscribeOn(Schedulers.io()) :这告诉Observable在后台线程上运行任务

    • observeOn(AndroidSchedulers.mainThread()) :这告诉Observer接收android UI线程上的数据,以便您可以执行任何与UI相关的操作 .

相关问题