【问题标题】:RxJava and Retrofit Chain multiple Calls from diffrent Services and ConditionsRxJava 和 Retrofit 链接来自不同服务和条件的多个调用
【发布时间】:2016-08-19 08:23:49
【问题描述】:

我没有找到正确的方法。问题是,我有两个 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);

现在是用例:

如果某些对象存在,我需要做一个请求:

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

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

serviceB.addObjectB(b)

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

如果 Exists 为假,我需要调用

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

谢谢

【问题讨论】:

    标签: java android rest rx-java retrofit2


    【解决方案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,并且可能对您已经尝试的内容关闭。

    【讨论】:

    • 这是什么意思:y A/art: art/runtime/barrier.cc:90] 检查失败:count_ == 0 (count_=-1, 0=0) 试图用非零计数 A/art: art/runtime/runtime.cc:366] 运行时中止 --- 递归,所以没有线程特定的细节! A/art: art/runtime/runtime.cc:366] A/libc: 致命信号 6 (SIGABRT),tid 20983 中的代码 -6
    • 不知道。我不在 Android 上开发。
    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2017-03-18
    • 2017-04-22
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多