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<..>() { ... })