来自不同服务和条件的RxJava和Retrofit Chain多个呼叫

时间:2016-08-19 08:23:49

标签: 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);

APIy:

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

现在用例:

如果某些Object存在,我需要执行请求:

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

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

serviceB.addObjectB(b)

然后第一个流程结束。

如果Exists为false,我需要致电

serviceA.addObject(a) 

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

ServiceB.addObject(b) 

一次。但我真的没有RxJava和Retrofit的链条。我可以使用类似的代码处理这些东西:

    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。有没有可能用更少的代码来做到这一点?

由于

1 个答案:

答案 0 :(得分:1)

您在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,可能会对您已经尝试过的内容关闭。