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