2016-08-19 46 views
1

我没有找到正确的方法。问题是,我有两个改进API和服务,需要两个等待响应并做出决定并基于其他调用。RxJava和改造链从不同的服务和条件多个呼叫

例子:

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) ... 

是否存在是真实的话,我需要调用

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一起等,但它工作无法正常链条,也是ErrorHandling中很奇怪,因为当我从后端得到一些错误时,我的应用程序会崩溃,这就是为什么我用OnComplete,OnError,OnNext添加每个调用Action3的原因。有没有可能用更少的代码来做到这一点?

谢谢

回答

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和其他变量来自于undertand

由于你可以看到,它只依赖于flatMap,并且可能会关闭你已经尝试过的东西。

+0

这是什么意思:y A/art:art/runtime/barrier.cc:90]检查失败:count_ == 0( count _ = - 1,0 = 0)试图消灭非零计数的屏障 A/art:art/runtime/runtime.cc:366]运行时中止---递归,所以没有线程特定的细节! A/libc:致命信号6(SIGABRT),代码-6中的tid 20983 –

+0

不知道。我不在Android上开发。 – dwursteisen