2016-09-16 48 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