Rx java Rxjava-热观测
我在RxJava中遇到了一个奇怪的问题:生产者(API请求)发出事件的速度太快,消费者(API响应)只得到API请求的第二个响应 假设我有几个请求需要发送到服务器以查询数据库,因为来自服务器的一些查询需要一些时间。因此,当我得到响应时,可能第二个请求首先返回,奇怪的是,有时我没有得到第一个请求的响应 进行api调用的代码:Rx java Rxjava-热观测,rx-java,Rx Java,我在RxJava中遇到了一个奇怪的问题:生产者(API请求)发出事件的速度太快,消费者(API响应)只得到API请求的第二个响应 假设我有几个请求需要发送到服务器以查询数据库,因为来自服务器的一些查询需要一些时间。因此,当我得到响应时,可能第二个请求首先返回,奇怪的是,有时我没有得到第一个请求的响应 进行api调用的代码: public void sendRequests() { // using RxJava to make server polling. startPol
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()的观测值?根据我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
)
}
不正确的并行性
Observable.just(1,2,3)
.flatMap(i -> doNetworkCall(i))
.first()
这样的代码可能导致并行执行“doNetworkCall(i)”,其中第二个答案可能比第一个更快。要进行验证,请改用“concatMap”,它可以保证正在处理的流的大小和顺序:
调试
运算符“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()
您是在Android应用程序中还是在测试中使用它?因为如果它是一个测试,它将失败,因为调用线程将订阅并只通过方法startPollingServer。不建议只在void方法中订阅。如果不处理订阅,将导致内存泄漏。你的startPolling方法应该在一个地方返回Observable和compose。我在一个android应用程序中使用sendRequests(),它是由用户启动的,我在模拟用户是否快速点击按钮或某个UI。它只是显示了一些代码片段,我有代码在应用程序被破坏时处理订阅,所以没有内存泄漏。为什么您确定这是RxJava问题,服务器确实在每种情况下都返回响应?这里似乎有独立的观测流。