2016-08-19 49 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