我有多个返回Observables的模块:O1, O2, O3... On
所有模块的结果应合并为一个可观察的Ocomb
,以便单个任务可能失败,但组合不会因个别问题而终止或影响。
根据我目前的解决方案,我遇到了各种问题,如下例所示:
此代码结合了我的模块的输出:
public Observable<Data> getModuleData(){
List<Observable<Data>> tasks = new ArrayList<>();
for(MyModule module : modules){
tasks.add(module.getData());
}
return Observable
.mergeDelayError(Observable.from(tasks))
.onBackpressureBuffer(MAX_BUFFER)
.observeOn(AndroidSchedulers.mainThread());
}
现在,我想要显示属性X
,例如所有已发射数据对象的'name'
:
public List<String> getNames() {
return getModuleData()
.map(new Func1<Data, String>() {
@Override
public String call(Data data) {
return data.getName();
}
})
.timeout(600, TimeUnit.MILLISECONDS)
.toList()
.toBlocking()
.firstOrDefault(new ArrayList<String>());
}
getNames()
方法应返回一个列表,因此阻止执行。
问题1
在RxJava中似乎有一个issue,如果我调用observeOn()
并使其阻塞,无论超时等等,它都不会返回。
问题2
如果onObserve()
被移除,代码将起作用,但在应用程序的不同位置,我将在UI中呈现非阻塞可观察的结果。数据将被显示,但之后我的UI做了疯狂的事情。我必须触摸我的UI列表组件,以便每次数据更改时刷新屏幕。
问题3
某些模块可能会产生内部错误,或者不会调用onCompleted()
。我认为mergeDelayError()
和timeout()
的组合可以处理这些情况,并为无响应的模块调用onCompleted()
。但是,如果其中一个模块未调用onCompleted()
并且timeout()
语句被删除,则阻塞调用将永远不会返回。
问题:
组合多个可观察对象的最佳方法是什么,以便单个可观察对象可以失败但是它被处理为onCompleted()
/忽略并且不会影响组合的可观察对象?
在不停止执行或以循环结束的情况下,使组合的可观察阻塞和处理超时的最佳解决方案是什么?
答案 0 :(得分:3)
组合多个observable的最佳方法是什么,以便单个observable可以失败但是它被处理为onCompleted()/ ignored并且不会影响组合的observable?
Observable.from(modules)
.flatMap(MyModule::getData)
.onErrorResumeNext(Observable.empty())
.timeout(600,TimeUnit.MILLISECONDS, Observable.empty())
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(System.out::println);
上面的流可以通过在subscribe()之前添加toBlock来转换为阻塞,但是除了测试之外没有多大意义