Rx java 链接具有不同发射类型的多个观测值
我想弄清楚如何把可观测的东西连在一起。我有一个现有的方法:Rx java 链接具有不同发射类型的多个观测值,rx-java,rx-android,concatmap,Rx Java,Rx Android,Concatmap,我想弄清楚如何把可观测的东西连在一起。我有一个现有的方法:公共静态可观察getData()。在我的另一个类中,我有以下现有代码: doSomeBackgroundWork() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<..>() { ... }) 但这不起作用,因为getData()代码实际上是在主线程上执行的 即使这样也不行:
公共静态可观察getData()
。在我的另一个类中,我有以下现有代码:
doSomeBackgroundWork()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })
但这不起作用,因为getData()代码实际上是在主线程上执行的
即使这样也不行:
doSomeBackgroundWork()
.concatMap(s -> call() {
mApi.getData()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })
flatMap
操作符是这里的方法,您只需要处理并发性。如果要在io
调度程序上运行整个getData()
方法,只需在flatMap
之前应用observeOn
操作符,然后在它之后再次应用,如下所示:
doSomeBackgroundWork()
.observeOn(Schedulers.io())
.flatMap(s -> call() {
mApi.getData()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })
非常感谢。这就是我要找的。我将使用第二种方法,其中我显式地告诉
getData()
到subscribeOn(Schedulers.io())
,但是我很好奇它们有什么不同。。我想这仅仅是实现同一目标的两种方法(无论如何,在本例中)。我假设.flatMap(…)
被认为是计算的一部分,因此链底部的.subscribeOn(…)
调用将指示.flatMap(…)
将在何处工作。查看ReactiveX上的文档,没有任何文档记录这种行为。我在哪里可以读到这种行为?老实说,这种行为并没有很好的记录,但它是有意义的flatMap
只订阅由observeOn
指定的线程上的一些其他可观察对象,但它仍然是一个自包含的流,应该处理自身的并发性。这两种方法是如何不同的。第一个——正如我在回答中试图描述的那样——是在io
调度程序上运行整个flatMap
回调,这意味着如果getData()
方法包含了创建可观察的所需的一些阻塞操作(即,一些繁重的计算来获取需要随请求发送到服务器的参数),计算也将在此调度程序上进行,而在第二种方法中,您只是告诉结果Observable
对其进行处理,而不是getData()中的计算
method。因为我不知道你在那里做什么工作,我觉得有必要描述这两种方法
doSomeBackgroundWork()
.zipWith(mApi.getData()),
new Func2<BgWork, DataResponse,DataResponse>() {
@Override
public DataResponse call(BgWork bgWork, DatResponse data) {
return data;
}})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })
doSomeBackgroundWork()
.observeOn(Schedulers.io())
.flatMap(s -> call() {
mApi.getData()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })
doSomeBackgroundWork()
.flatMap(s -> call() {
mApi.getData().subscribeOn(Schedulers.io())
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })