RxJava重新组合多个可观察量的方法

时间:2016-05-18 09:50:12

标签: android rx-java reactive-programming

我有多个返回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() /忽略并且不会影响组合的可观察对象?

在不停止执行或以循环结束的情况下,使组合的可观察阻塞和处理超时的最佳解决方案是什么?

1 个答案:

答案 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来转换为阻塞,但是除了测试之外没有多大意义