有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我走错了路。问题是,我有两个改型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) ...

如果存在是真的,那么我需要打电话

serviceB.addObjectB(b)

然后第一个流程完成

如果存在是假的,我需要打电话

serviceA.addObject(a) 

然后,当我在onNext获得成功时,我需要打电话

ServiceB.addObject(b) 

再说一遍。但我真的没有得到RxJava和改装的链条。我可以用很多行代码处理这些东西,比如:

    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等工具将所有内容链接在一起,但它在链接中无法正常工作,而且错误处理也很奇怪,因为当我从后端收到一些错误时,我的应用程序将崩溃,这就是为什么我使用OnComplete、OnError、OnNext添加每个调用Action3的原因。有没有可能用更少的代码来实现这一点

谢谢


共 (1) 个答案

  1. # 1 楼答案

    你用flatMap试过什么

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

    因此,可以这样实现:

     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,并且可能与您已经尝试过的内容接近