我有一个这样的补全内容:
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>
的设置会影响在其上执行的线程吗?
答案 0 :(得分:0)
根据文档Single.flatMapCompletable()
flatMapCompletable默认情况下在特定的Scheduler上不运行。
这意味着如果您不显式调用调度程序之间的切换,则将completable
与startSomething()
与先前的链式操作在同一调度程序(线程)上调用。
要在调度程序之间切换,可以使用observeOn()
运算符。在您的情况下,反应链看起来像
Single.fromCallable(getParams())
.subscribeOn(Schedulers.io())
.observeOn(this.schedulers.mainThread())
.flatMapCompletable(::startSomething)
在这种情况下,subscribeOn()
在getParams()
上执行Schedulers.io()
,然后observeOn()
切换到主线程并在其上执行startSomething()
。