android Retrofit中的Rxjava observeOn和subscribeOn

mbjcgjjk  于 2023-06-20  发布在  Android
关注(0)|答案(4)|浏览(215)

当调用API时,我希望在IO线程上运行与服务器的通信,并希望在mainThread上处理结果。
我在许多教程中看到下面的代码,毫无疑问它是正确的。但是我的理解是相反的所以我想知道我误解了什么。

  1. requestInterface.callApi()
  2. .observeOn(AndroidSchedulers.mainThread())
  3. .subscribeOn(Schedulers.io())
  4. .subscribe())
    • observeOn(AndroidSchedulers. mainThread())**

:observeOn将所有运算符的线程更改到更下游,但在示例中,实际调用的API函数高于observeOn?

  • . subscribeOn(Schedulers.io())*

:奇怪的是,它需要在主线程上订阅,但在IO线程上订阅?
请告诉我我误解了什么?

aoyhnmkz

aoyhnmkz1#

基本的,我们将有

  1. Observable.subscribe(Observer);// => Observer observe Observable and Observable subscribe Observer

示例

  1. requestInterface.callApi().subscribe(new Observer...); // requestInterface.callApi() <=> Observable

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

    • 订阅开启**
  • SubscribeOn运算符指定Observable将在哪个线程上开始操作,无论在运算符链的哪个点调用该运算符
    • ObserveOn**(影响2项)
  • 指示Observable向指定Scheduler上的Observers发送通知。
  • ObserveOn会影响Observable将在该运算符出现的下方使用的线程

示例

  1. registerUserReturnedObserverble() // run on worker thread because subscribeOn(Schedulers.io()) (line 5)
  2. .andThen(loginReturnObserverble()) // run on worker thread because subscribeOn(Schedulers.io()) (line 5)
  3. .observeOn(AndroidSchedulers.mainThread())
  4. .andThen(getUserDataReturnObserverble()) // run on main thread because .observeOn(AndroidSchedulers.mainThread()) is above this operator (line 3)
  5. .subscribeOn(Schedulers.io())
  6. .subscribe(new Observer<Void>{
  7. // run on main thread because observeOn(AndroidSchedulers.mainThread())
  8. });
展开查看全部
apeeds0o

apeeds0o2#

  • subscribeOn(Schedulers.io()):这告诉Observable在后台线程上运行任务
      • observeOn(AndroidSchedulers. mainThread())**:这告诉Observer接收android UI线程上的数据,以便您可以采取任何UI相关的操作。
aiqt4smr

aiqt4smr3#

下面是一个示例:

  1. getCardsObservable.subscribeOn(Schedulers.io())
  2. .observeOn(AndroidSchedulers.mainThread())
  3. .subscribe(new rx.Observer<List<Card>>() {
  4. @Override
  5. public void onCompleted() {
  6. }
  7. @Override
  8. public void onError(Throwable e) {
  9. listener.onError(e.getMessage());
  10. }
  11. @Override
  12. public void onNext(List<Card> cards) {
  13. listener.onSuccess(cards);
  14. }
  15. });

**subscribeOn -->**执行调用的线程,类似于调用asynctask
**observeOn -->**其中响应将在UI线程的进程中被观察
**subscribe -->**观察者回调

展开查看全部
nnvyjq4y

nnvyjq4y4#

以下情况指定了使用observeOn()和/或subscribeOn()时可能出现的所有不同情况。

  1. subscribeOn影响上游运算符(subscribeOn之上的运算符)
  2. observeOn影响下游运算符(observeOn下面的运算符)
    1.如果你没有在RxJava中指定线程(如果你没有指定subscribeOnobserveOn或两者),数据将由当前的调度器/线程(通常是主线程)发出和处理。例如,下面链中的所有运算符都将由当前线程(Android的主线程)处理。
  1. Observable
  2. .just("big", "bigger", "biggest")
  3. .map(String::length)
  4. .filter { it > 6 }
  5. .subscribe { length -> println("item length $length") }

1.如果只指定了subscribeOn,则将在该线程上执行所有运算符

  1. Observable
  2. .just("big", "bigger", "biggest")
  3. .subscribeOn(Schedulers.io())
  4. .map(String::length)
  5. .filter { it > 6 }
  6. .subscribe { length -> println("item length $length") }

仅数据发射,Map和过滤操作符将在io调度器上执行,如上游操作符subscribeOn所指示的。
1.如果只指定了observeOn,则所有运算符都将在当前线程上执行,只有observeOn以下的运算符才会切换到observeOn指定的线程

  1. Observable
  2. .just("big", "bigger", "biggest")
  3. .map(String::length)
  4. .observeOn(Schedulers.computation())
  5. .filter { it > 6 }
  6. .subscribe { length -> println("item length $length") }

数据发射,Map将在currentThread调度器上执行。
filter将在计算调度器上执行,如下游运算符observeOn所指示的。
1.如果同时指定了subscribeOnobserveOn,则observeOn以下的所有运算符将切换到observeOn指定的线程,其余observeOn以上的运算符将切换到subscribeOn指定的线程。无论指定subscribeOnobserveOn的顺序如何,这都是正确的

  1. Observable
  2. .just("big", "bigger", "biggest")
  3. .subscribeOn(Schedulers.io())
  4. .map(String::length)
  5. .observeOn(Schedulers.computation())
  6. .filter { it > 6 }
  7. .subscribe { length -> println("item length $length") }

数据发射和Map操作符将在io调度器上执行,如上游操作符subscribeOn所指示的。
filter将在计算调度器上执行,如下游运算符observeOn所指示的。
即使subscribeOn在observeOn之后被调用,线程的使用也是相同的。

  1. Observable
  2. .just("big", "bigger", "biggest")
  3. .map(String::length)
  4. .observeOn(Schedulers.computation())
  5. .filter { it > 6 }
  6. .subscribeOn(Schedulers.io())
  7. .subscribe { length -> println("item length $length") }
展开查看全部

相关问题