2016-10-18 5 views
0

현재 RxJava를 사용하여 서버 폴링을 구현하려고합니다. 서버 응답을받은 후 전체 체인을 반복하는 방법에 대한 연구를 해본 결과 repeat()로 시도했습니다. 작동하지만 완벽하게 작동하지 않는 이유는 api 호출을 여러 번 호출하고 서버가 클라이언트에 보내기 전에 데이터를 처리하는 데 여분의 시간이 필요하기 때문에 정확한 시간을 알지 못하기 때문에 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 새로운 오전, 단지 배압이라는 주제를 가지고, 기사의 많은 내가 원하는 해달라고 때문에, 그것을 처리하는 방법을 설명있다 이 응답을 캐시하면 제목이 좋은 옵션이 될 것 같아서 언제 끌 것인지 제어 할 수 있습니다. @Gary LO에

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

그리고 감사

답변

0

많은 방법이 있어야한다. 그 중 하나를 공유하고 싶습니다.

  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); 
    

재밌게!

노트 내가 pollingSignal.onNext(null)를 사용하는 것이 편안하지 않기 때문에 대신 PublishSubject<Void>PublishSubject<Boolean>이 사용.

하지만 코 틀린에서 PublishSubject<Unit>pollingSignal.onNext(Unit)

을 사용할 수 있습니다.