2016-09-16 47 views
2

我正在RxJava/Android中開發一個完整的應用程序,試圖使事情成爲最可能的Rx方式。RxJava運算符只在某些條件下用來鏈接observables

我想我達到了我想要的,但現在我遇到了一個問題,我確信存在一個更好的方法來做到這一點。 它包括:

  1. 從可觀察到的
  2. 一個獲取一個布爾值:如果這是真的,你都做了,返回true。 B:如果它是假的,請求一個請求(稱之爲firstRequest)並接收一個Observable。
  3. 答:同樣的,如果它是真的,你完成了,返回true。 B:如果它是錯誤的,則發出另一個請求(secondRequest)。
  4. 答:如果它返回true,那麼你就完成了。如果它是false,則啓動processFailed();

現在我已經在一個非常簡單的方式實現了它(和次優):

public void startProcess(){ 
    dataRepository.getStatus() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     makeFirstRequest(); 
     } 
    }); 
} 

private void makeFirstRequest(){ 
    dataRepository.firstRequest() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     makeSecondRequest(); 
     } 
    }); 
} 

private void makeSecondRequest(){ 
    dataRepository.firstRequest() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     processFailed(); 
     } 
    }); 
} 

我想知道如何將這些操作的方式,更有意義相結合(我偷看了combine,但我認爲這不是它的預期用例),我認爲三次訂閱都不正確。

我想過flatMapping(因爲它有意義返回Observable),但嵌套的操作鏈(flatMap在flatMap內部的flatMap)讓我覺得必須有一種更簡單的方式來實現與某些運算符相同的結果。

在此先感謝。

回答

7

flatMap救援:

dataRepository.getStatus() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest()) 
    .flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest()) 
    .defaultIfEmpty(false) 
    .subscribe(status -> { 
    if(status){ 
     processCompleted(); 
    } else { 
     processFailed(); 
    } 
    }); 

您還可以Observable.just(status)取代Observable.empty

+0

哇,不知道defaultIfEmpty,它實際上鍊非常清楚。非常感謝! – dexafree