RxJava结合观察者(不是Observables)

时间:2018-01-07 10:49:50

标签: android rx-java2 observers

我还是RxJava的新手,我对我的一些代码感到有点困惑,我没有直接访问Observables,但是将Observer作为某个方法的参数传递给Observable。

我想以某种方式结合两个观察者,但无法弄清楚如何用观察者做到这一点。

在这里,我想“组合”mGetPotatoes和mGetBurger,只有在onNext时才会显示土豆和汉堡(我猜是Obregables会是zip())。

给我看一些代码

    mGetPotatoes.execute( new DisposableObserver<List<Potatoes>>() {
        @Override
        public void onNext(List<Potatoes> potatoes) {
            getMvpView().showPotatoes(mPotatoesMapper.mapPotatoesToViewModels(potatoes));
        }

        @Override
        public void onComplete() {

        }

        @Override
        public void onError(Throwable e) {
            getMvpView().hideProgress();
            getMvpView().showErrorMessage(e.getMessage());
        }
    });


    mGetBurger.execute( new DisposableObserver<Burger>() {
        @Override
        public void onNext(Burger burger) {
            getMvpView().showBurger(mBurgerMapper.mapBurgerToViewModel(burger));
        }

        @Override
        public void onComplete() {

        }

        @Override
        public void onError(Throwable e) {
            getMvpView().hideProgress();
            getMvpView().showErrorMessage(e.getMessage());
        }
    });

修改

这个问题是this one的一个子集,其中mGetPotatoes和mGetBurger(即UseCases)的模板代码是。

2 个答案:

答案 0 :(得分:0)

我希望你改变你的架构,以便返回Observable,你可以操纵它(更改调度程序,执行某些操作等)

如果该选项不可行,您可以获得Subject的解决方法。 SubjectObserver,也是Observable

对于你的情况:

  1. 创建几个PublishSubject
  2. 将两者(使用zip)运算符组合并订阅结果
  3. 将两个主题都传递给原始用例

答案 1 :(得分:0)

不确定这是什么框架,但您可以通过打包将execute调用转回Observable

Observable<List<Potatoes>> obs = new Observable<List<Potatoes>>() {
    @Override public void subscribeActual(final Observer<? super List<Potatoes>> s) {
        mGetPotatoes.execute(new DisposableObserver<List<Potatoes>>() {

            @Override
            public void onStart() {
                s.onSubscribe(this);
            }

            @Override
            public void onNext(List<Potatoes> potatoes) {
                s.onNext(potatoes);
            }

            @Override
            public void onComplete() {
                s.onComplete();
            }

            @Override
            public void onError(Throwable e) {
                s.onError(e);
            }
        } 
    }
};