我正在试图弄清楚如何将观察者链接在一起。我有一个现有的方法: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<..>() { ... })
答案 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<..>() { ... })