2016-09-16 8 views
2

RxJava/Androidでアプリケーション全体を開発して、Rxウェイを可能にしようとしています。RxJava演算子を使用して特定の条件でのみオブザーバブルを連鎖させる

私は私が望んでいたものを達成していると思いますが、今はもっと良い方法があると確信しています。 それはで構成されています

  1. が観測
  2. Aからブールを取得:それは本当だ場合、あなたが行われ、trueを返します。 B:偽であれば、リクエストして(firstRequestと呼ぶ)Observableを受け取ります。
  3. A:同じ場合は、それが完了した場合はtrueを返します。 B:偽であれば、別のリクエスト(secondRequest)を行います。
  4. A: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を見ましたが、これはこれが意図したユースケースではないと思います)、3回購読するのは間違いです。

私は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

WowはdefaultIfEmptyについて知らなかったが、実際には非常に明確に連鎖している。どうもありがとう! – dexafree