在flatMapCompletable内部调用subscribeOn时将使用什么线程?

时间:2018-11-20 00:20:17

标签: java rx-java

我有一个这样的补全内容:

public class Params {
    // Contains input parameters
}

public Completable startSomething(Params params) {
    return Completable
        .fromRunnable(() -> someMainThreadThing(params))
        .subscribeOn(this.schedulers.mainThread());
}

现在,我有一个提供Single<Params>的消息来源。这是作为API的一部分提供的,因此在订阅时当前线程是未知的。这种用法看起来像这样:

public Completable doSomethingWithParams(Single<Params> params) {
    // Do something with the params
}

我想这样实现doSomethingWithParams

public Completable doSomethingWithParams(Single<Params> params) {
    return params.flatMapCompletable(::startSomething);
}

我的问题是,是否保证someMainThreadThing将在主线程上执行,或者Single<Params>的设置会影响在其上执行的线程吗?

1 个答案:

答案 0 :(得分:0)

根据文档Single.flatMapCompletable()

  

flatMapCompletable默认情况下在特定的Scheduler上不运行。

这意味着如果您不显式调用调度程序之间的切换,则将completablestartSomething()与先前的链式操作在同一调度程序(线程)上调用。

要在调度程序之间切换,可以使用observeOn()运算符。在您的情况下,反应链看起来像

Single.fromCallable(getParams())
    .subscribeOn(Schedulers.io())
    .observeOn(this.schedulers.mainThread())
    .flatMapCompletable(::startSomething)

在这种情况下,subscribeOn()getParams()上执行Schedulers.io(),然后observeOn()切换到主线程并在其上执行startSomething()