RxJava 和 Retrofit 链接来自不同服务和条件的多个调用

RxJava and Retrofit Chain multiple Calls from diffrent Services and Conditions

我没有找到正确的方法。问题是,我有两个 Retrofit API´s 和服务,需要两个等待响应并根据其他调用做出决定。

示例:

APIx:

@GET("xyz/{id}/exists")
Observable<Exists> checkObjectExists(@Path("id") String id);

@POST("xyz/")
Observable<Object> addObjectA(@Body Object a);

APIy:

@POST("abc/{id}/blabla")
Observable<Object> addObjectB(@Path("id") String id, @Body Object b);

现在用例:

如果存在某些对象,我需要执行请求,例如:

serviceA.exists(id).flatMap(exists -> if(exists) ...

如果 Exists 为真,那么我需要调用

serviceB.addObjectB(b)

那么第一个流程就结束了。

如果 Exists 为假我需要调用

serviceA.addObject(a) 

然后当我在 onNext 中获得成功时,我需要调用

ServiceB.addObject(b) 

再次。但我真的没有用 RxJava 和 Retrofit 得到 Chain。我可以用很多行代码来处理这些东西,比如:

    private void _checkExists() {
    ServiceA serviceA= ServiceA.create();
    serviceA.checkObjectExists(id)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<Exists>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Something get Wrong");
                }

                @Override
                public void onNext(Exists exists) {
                    if(exists) {
                        _addObjectB(b);
                    } else {
                        addobjectA(a);
                    }
                }
            });
}

private void addObjectA(Object a) {
    ServiceA serviceA= ServiceA.create();
    serviceA.addObjectA(a)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Something get Wrong");
                }

                @Override
                public void onNext(Object a) {
                    addObjectB();
                }
            });
}

private void addObjectB() {
    ServiceB serviceB= ServiceB .create();
    serviceB.addObjectB(id, b)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Something get Wrong");
                }

                @Override
                public void onNext(Object b) {
                    Timber.d("Everything is ok");
                }
            });
}

我尝试将所有内容与 flatMap 等链接在一起,但它在链中无法正常工作,而且 ErrorHandling 也很奇怪,因为当我从后端收到一些错误时,我的应用程序将崩溃,这就是为什么我使用 OnComplete、OnError、OnNext 添加每次调用 Action3。有没有可能用更少的代码来做到这一点?

谢谢

你用 flatMap 尝试过什么?

关于您的代码,您调用 checkObjectExists 然后根据结果 addObjectA 然后 addObjectB 或仅 addObjectB.

接缝

所以,可以这样实现:

 ServiceA serviceA= ServiceA.create();
 ServiceA serviceB= ServiceB.create();

 serviceA.checkObjectExists(id)
         .flatMap(exists -> {
                if(exists) {
                    return serviceB.addObjectB(id, b)
                } else {
                    return serviceA.addObjectA(id, a).flatMap(newA -> serviceB.addObject(id, newA);
                }

         })
         .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .subscribe();

(因为它遗漏了您代码的某些部分,所以很难理解 ab 和其他变量的来源。

如您所见,它仅依赖于flatMap,并且可能与您已经尝试过的相近。