链接具有不同发射类型的多个可观测量

时间:2017-01-10 19:34:16

标签: rx-java rx-android concatmap

我正在试图弄清楚如何将观察者链接在一起。我有一个现有的方法:public static Observable<Data> getData()。在我的其他课程中,我有这个现有的代码:

doSomeBackgroundWork()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<..>() { ... })

我现在要将getData()来电链接到这个电话。我该怎么做?我最初尝试过这个:

doSomeBackgroundWork()
.flatMap(s -> call() {
   mApi.getData()
}
.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<..>() { ... })

另外,当我尝试这个时,问题是zipWith意味着两个observable并行运行,我真的想要一个接一个地运行。

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

1 个答案:

答案 0 :(得分:3)

flatMap运算符是这里的方法,你只需要处理并发。如果您想在getData()日程安排程序上运行整个io方法,那么您可以在observeOn之前应用flatMap运算符,然后再按照此类运行:

doSomeBackgroundWork()
  .observeOn(Schedulers.io())
  .flatMap(s -> call() {
       mApi.getData()
  }
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Subscriber<..>() { ... })

你看,subscribeOn操作员强迫生产者去&#34;计算&#34;并在提供的调度程序上发出数据,因此在流组合中将它用于何处并不重要,并且在多次使用时也无效。但observeOn运算符不是这种情况。它告诉下一个流在另一个Scheduler上执行工作。这意味着,当您稍后再次使用它时,您可以再次将计算转移到另一个计划程序。

但是,如果您只需要执行由另一个调度程序上的getData()方法返回的observable生成的工作,则可以在此可观察对象上使用subscribeOn而不是在主流上。

doSomeBackgroundWork()
  .flatMap(s -> call() {
       mApi.getData().subscribeOn(Schedulers.io())
  }
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Subscriber<..>() { ... })