2016-10-18 9 views
0

現在、私はRxJavaを使用してサーバポーリングを実装しようとしていますが、サーバレスポンスを受信した後にチェーン全体を繰り返す方法についていくつかの調査を行いました。クライアントに送信する前にデータを処理する余分な時間が必要ですが、正確な時刻はわかりませんので、repeatWhen()を使用することはできません特定の時間。私が使用できる唯一のことは、apiの応答後に待つことです。RxJavaを使用したサーバポーリング - サーバレスポンス取得後の繰り返し

アドバイスをいただければ幸いです!

次のコードスニペットです:

retrofitService.requestPolling() 
       .repeat() // do not wait to call server so many times 
       .takeUntil(new Func1<PollResponse, Boolean>() { 
         @Override 
         public Boolean call(PollResponse pollResponse) { 
          return pollResponse.mComplete; 
         } 
       }) 
      .doOnNext(new Action1<FlightSearchPollResponse>() { 
       @Override 
       public void call(pollResponse pollResponse) { 
         // update UI here 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<PollResponse>() { 
       @Override 
       public void onCompleted() { 

        } 
       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(PollResponse pollResponse) { 

      }); 

編集:私は、RxJavaに新しいですだけ背圧と呼ばれるこのトピックを得た、との記事がたくさんあるが、それに対処する方法を説明し、私がしたいいけないので、このレスポンスをキャッシュすると、サブジェクトが適切なオプションになるようですが、いつプルするかを制御できます。

http://akarnokd.blogspot.com/2015/06/subjects-part-1.html

そして@Gary LOのおかげ

答えて

0

多くのアプローチがあるはずです。私はそれらの1つを共有したいと思います。

  1. 再びそれを行うための信号を公開API呼び出し
  2. に信号を変換する別の信号ストリームPublishSubject pollingSignal

  3. を作成します。

    final PublishSubject<Boolean> pollingSignal = PublishSubject.create(); 
    
    final Observable<PollResponse> apiResponse = retrofitService.requestPolling(); 
    
    pollingSignal 
        .flatMap(x -> apiResponse) 
        .subscribe(new Observer<PollResponse>() { 
        @Override 
        public void onCompleted() {} 
    
        @Override 
        public void onError(Throwable throwable) {} 
    
        @Override 
        public void onNext(PollResponse integer) { 
         // start the next polling 
         pollingSignal.onNext(true); 
        } 
    }); 
    
    // start the first polling 
    pollingSignal.onNext(true); 
    

お楽しみに!

ノート PublishSubject<Boolean>の代わりPublishSubject<Void>を使用して、私はpollingSignal.onNext(null)を使用して快適に感じていないためです。

コトルでは、PublishSubject<Unit>pollingSignal.onNext(Unit)

とを使用できます
関連する問題