【问题标题】:Execute 2 observables sequentially and get the result at once - RxJava 2顺序执行 2 个 observables 并立即获得结果 - RxJava 2
【发布时间】:2017-02-28 21:16:51
【问题描述】:

我有这个功能:

public static class CombinedResult<T, R> {
    T t;
    R r;

    public CombinedResult(T t, R r) {
        this.t = t;
        this.r = r;
    }

    public T getObject1() {
        return t;
    }

    public void setObject1(T t) {
        this.t = t;
    }

    public R getObject2() {
        return r;
    }

    public void setObject2(R r) {
        this.r = r;
    }

}

public static <A, B> Observable<CombinedResult<A, B>> combineObservablesParallel(Observable<A>
    return Observable.zip(observable1, observable2, new BiFunction<A, B, CombinedResult<A, B>>() {
        @Override
        public CombinedResult<A, B> apply(A a, B b) throws Exception {
            return new CombinedResult<>(a,b);
        }
    });
}

它结合2个observables并返回1个Observable,这会将两个observables的结果放入CombinedResult对象,这里的问题是zip 函数在 Parallel 上组合 observables。

我想要与 zip 相同的东西,它按顺序执行 observable 并在 BiFunction 或类似的东西中返回结果。

有什么解决办法?

【问题讨论】:

  • 试试Observable.concat()

标签: android rx-java rx-java2


【解决方案1】:

observable1 上使用flatMap 运算符并结合observable2zip 运算符:

RxJava 1:

return observable1
                .flatMap(new Func1<A, Observable<CombinedResult<A, B>>>() {
                    @Override
                    public Observable<CombinedResult<A, B>> call(A a) {
                        return Observable.just(a).zipWith(observable2, new Func2<A, B, CombinedResult<A, B>>() {
                            @Override
                            public CombinedResult<A, B> call(A a, B b) {
                                return new CombinedResult<>(a, b);
                            }
                        });
                    }
                });

RxJava 2:

return observable1.flatMap(new Function<A, ObservableSource<CombinedResult<A,B>>>() {
    @Override
    public ObservableSource<CombinedResult<A,B>> apply(A a) throws Exception {
        return Observable.just(a).zipWith(observable2, new BiFunction<A, B, CombinedResult<A, B>>() {
            @Override
            public CombinedResult<A, B> apply(A a, B b) throws Exception {
                return new CombinedResult<>(a,b);
            }
        });
    }
});

RxJava 2 Lambda:

return observable1.flatMap(a -> Observable.just(a).zipWith(observable2, CombinedResult::new));

【讨论】:

  • 谢谢,我刚刚修改了 RxJava 2 的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多