현재 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) {
} );
편집 : 나는 RxJava를 처음 접했고 BackPressure라는 주제를 얻었 으며이 응답을 캐시하고 싶지 않기 때문에 처리 방법을 설명하는 많은 기사가 있습니다. Subject가 좋은 옵션이 될 것입니다. 당길 때.
http://akarnokd.blogspot.com/2015/06/subjects-part-1.html
@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);
즐기세요!
주 사용 PublishSubject<Boolean>
대신은 PublishSubject<Void>
내가 사용하는 것이 편안하지 않기 때문에 pollingSignal.onNext(null)
.
하지만 Kotlin에서는 다음 PublishSubject<Unit>
과 함께 사용할 수 있습니다 .pollingSignal.onNext(Unit)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다