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

标签 java android rest rx-java retrofit2

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

例子:

APIx:

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

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

应用:

@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 等链接在一起,但它在 Chain 中无法正常工作,而且 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,并且可能对您已经尝试过的内容关闭。

关于java - RxJava 和 Retrofit 链接来自不同服务和条件的多个调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39034377/

相关文章:

java - 不幸的是 <app><package> 已在 android 模拟器中停止-错误,如何解决这个问题?

java - 在 HBase 中格式化输出

java - 在android上解码加密信息

java - android studio,哪个导入语句使用外部库?

android - Robospice : CachedSpiceReques. 未找到 getSpiceRequest

javascript - 主干 - 更改默认的 GET URL 格式

javascript - 将 $http.get 转换为 Restangular

java - 使用 repaint() 调用带参数的paintComponent()

java - 首次开发Android应用程序时如何在Java中修复 "R.menu.main"?

android - 来自 R.drawable 的 +imageResource 在 Jetpack Compose 中导致 IllegalArgumentException