Rx java 使用RxJava进行服务器轮询-获取服务器响应后重复

Rx java 使用RxJava进行服务器轮询-获取服务器响应后重复,rx-java,reactive-programming,polling,Rx Java,Reactive Programming,Polling,目前我正在尝试使用RxJava实现服务器轮询,我已经研究了如何在接收到服务器响应后重复整个链,我已经尝试了repeat(),它可以工作,但并不完美,原因是它会多次调用api,服务器在发送到客户端之前需要额外的时间来处理数据,但我们不知道确切的时间,因此无法使用repeatWhen()来给出具体的时间。我唯一能用的就是在api响应之后等待 任何建议都将不胜感激 以下是代码片段: retrofitService.requestPolling() .repeat() /

目前我正在尝试使用RxJava实现服务器轮询,我已经研究了如何在接收到服务器响应后重复整个链,我已经尝试了repeat(),它可以工作,但并不完美,原因是它会多次调用api,服务器在发送到客户端之前需要额外的时间来处理数据,但我们不知道确切的时间,因此无法使用repeatWhen()来给出具体的时间。我唯一能用的就是在api响应之后等待

任何建议都将不胜感激

以下是代码片段:

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

            } );
requestservice.requestPolling()
.repeat()//不要等待多次调用服务器
.takeUntil(新函数1(){
@凌驾
公共布尔调用(PollResponse PollResponse){
返回pollResponse.mComplete;
}
})
.doOnNext(新行动1){
@凌驾
公共无效调用(pollResponse pollResponse){
//在此处更新用户界面
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
}
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(PollResponse PollResponse){
} );
编辑:我是RxJava新手,刚学了一个叫做背压的主题,有很多文章解释了如何处理它,因为我不想缓存这个响应,似乎主题是一个不错的选择,它允许你控制何时拉


多亏了@Gary LO

,应该有很多方法。我想分享其中一个

  • 创建单独的信号流
    PublishSubject pollingSignal
  • 将信号转换为api调用
  • 发布再次执行此操作的信号

    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);
    
    final PublishSubject pollingSignal=PublishSubject.create();
    最终可观察到的apiResponse=RefughtService.requestPolling();
    轮询信号
    .flatMap(x->apiResponse)
    .订阅(新观察员){
    @凌驾
    已完成的公共void(){}
    @凌驾
    公共无效者(可抛弃者){}
    @凌驾
    public void onNext(PollResponse整数){
    //开始下一次轮询
    pollingSignal.onNext(真);
    }
    });
    //开始第一次轮询
    pollingSignal.onNext(真);
    
  • 玩得开心

    注释 使用
    PublishSubject
    而不是
    PublishSubject
    是因为我觉得使用
    pollingSignal.onNext(null)
    不舒服

    但在Kotlin中,我可以将
    PublishSubject
    pollingSignal.onNext(Unit)