Rxjava:multible Observables,如果只是之前的失败,则执行下一个observable

时间:2017-11-21 16:41:55

标签: android rx-java rx-java2

我有一个案例,当我有多个observable,每个observable都有自己的实现,它们可能是相同的类型,或者我还没有决定知道的不同,但我们假设它们是相同的类型。

Observable<String> source1;
Observable<String> source2;
Observable<String> source3;
Observable<String> source4;

我现在需要做的只是执行其中一个,所以如果上一个失败,流只会移动到下一个observable。

一些可能的解决方案

  • onErrorResumeNext()如果它们只有两个则可能是好的 observables,但在我的情况下,如果我需要更改执行顺序,很难更新每个observable。

  • 有最新组合,但我不知道它是否与我一样 描述,或根据需要进行哪些修改。

如何实现这样的目标,如果他们有不同的类型,我需要做什么?

2 个答案:

答案 0 :(得分:1)

我不知道是否有更好的方法可以做到这一点,但我会在import traceback # ... your code ... con = psycopg2.connect("host='localhost' dbname='football' user='postgres' password='XXX'") cur = con.cursor() try: cur.execute("CREATE TABLE testtest123 (HY INTEGER PRIMARY KEY)") cur.execute("INSERT INTO testtest123(new_data)") cur.execute("SELECT * FROM testtest123;") con.commit() except: print ("Error:") traceback.print_exc() con.rollback() sys.exit(1) finally: if con: con.close() 的帮助下使用onErrorResumeNext()来使其变得灵活:

Observable<String> buildObservable(Observable<String> obs, Observable<String>... subsequentObservables) {
    Observable<String> observable = obs;
    for (int i = 0; i < subsequentObservables.length; i++) {
        observable = concatErrorObservable(observable, subsequentObservables[i]);
    }

    return observable;
}

其中concatErrorObservable是:

Observable<String> concatErrorObservable(Observable<String> observable, Observable<String> observable2) {
        return observable.onErrorResumeNext(observable2);
    }

因此,您只需要向Observable方法提供buildObservable列表。例如:

buildObservable(Observable.error(new Throwable("error!!")), 
    Observable.just("observable2"), 
    Observable.just("observable3"))
.subscribe(s -> Log.d(TAG, "result: " + s));

将打印observable2(在logcat中),因为第一个observable会抛出错误。

关于不同的类型,您可能需要为每个map使用不同的Observable,因为我认为您的消费者(观察者)只期望一种类型的发布数据。

答案 1 :(得分:1)

您可以使用onErrorResumeNextreduce这样的组合观察结果:

Observable<String> buildObservable(List<Observable<String>> observables) {
    return Observable.fromIterable(observables)
            .reduce(Observable::onErrorResumeNext)
            .flatMapObservable(obs -> obs);
}

<强>更新 要进一步解释,如果您使用列表[o1, o2, o3]调用该方法,那么

  • fromIterable会返回更高级别可观察对象 just(o1, o2, o3)

  • reduce将组合此可观察元素的元素,依次调用onErrorResumeNext()与每个元素,如下所示:

    o1 -> o1.onErrorResumeNext(o2) -> o1.onErrorResumeNext(o2).onErrorResumeNext(o3), 
    

    导致更高级别&#34; 1元素可观察,相当于 just(o1.onErrorResumeNext(o2).onErrorResumeNext(o3))

  • flatMapObservable()行会将此1元素的observable替换为其唯一的元素本身,即 o1.onErrorResumeNext(o2).onErrorResumeNext(o3) (不包含just() )。

此结果实现了您需要的回退机制。