当生产者(API请求)发出的事件太快而且消费者(API响应)只获得API请求的第二个响应时,我在RxJava中遇到了一个奇怪的问题。
让我们说有几个请求需要发送到服务器来查询数据库,因为来自服务器的一些查询需要一些时间。因此,当我得到响应时,第二个请求可能首先返回,而奇怪的是有时候我没有得到第一个请求的响应。
发出api呼叫的代码:
public void sendRequests() {
// using RxJava to make server polling.
startPollingServer();
}
startPollingServer()方法是使用RxJava从服务器轮询数据。
public void startPollingServer() {
mApiService.getPollingFromServer()
.retryWhen()
.repeatWhen()
.map()
.subscribeOn()
.observeOn()
.subscribe(
// call onNext
// call onError
)
}
但是,当sendRequests()调用太快时,onNext,onComplete,onError都不会被调用。第一次请求没有发生任何事情。 但我确实收到了CharlesProxy的第一个回复,这真的很奇怪。
所以我的问题是,RxJava可能会忽略我的第一个回复吗?我是否需要合并来自startPollingServer()的Observable?
答案 0 :(得分:1)
根据我2年多的RxJava经验,它失去一些数据的可能性很小。 考虑以下事项:
错误被抑制
使用retryWhen和repeatWhen可能会导致错误抑制,请尝试添加'onError()'运算符来捕获它们:
public void startPollingServer() {
mApiService.getPollingFromServer()
.doOnError(throwable -> log.error("Got an error", throwable)) // catch error
.retryWhen()
.repeatWhen()
.map()
.subscribeOn()
.observeOn()
.subscribe(
// call onNext
// call onError
)
}
http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnError(rx.functions.Action1)
并行度不正确
Observable.just(1,2,3)
.flatMap(i -> doNetworkCall(i))
.first()
此类代码可能导致并行执行'doNetworkCall(i)',其中第二个答案可能比第一个答案更快。要进行验证,请改用“concatMap”,以保证正在处理的流的顺序和顺序:http://reactivex.io/documentation/operators/concat.html
<强>调试强>
运算符'doOnNext()','doOnSubscribe()','doOnCompleted()'和'doOnError()'可以帮助您找到错误
Observable.just(1,2,3)
.flatMap(i -> doNetworkCall(i)
.doOnSubscribe(() -> log.debug("Launched {}", i))
.doOnNext(response -> log.debug("Got response {} for {}", response, i))
.doOnError(throwable -> log.error("For error for " + i, throwable))
.doOnComplete(() -> log.info("Finished processing of {}", i))
)
.first()