Rx java Rxjava-热观测

Rx java Rxjava-热观测,rx-java,Rx Java,我在RxJava中遇到了一个奇怪的问题:生产者(API请求)发出事件的速度太快,消费者(API响应)只得到API请求的第二个响应 假设我有几个请求需要发送到服务器以查询数据库,因为来自服务器的一些查询需要一些时间。因此,当我得到响应时,可能第二个请求首先返回,奇怪的是,有时我没有得到第一个请求的响应 进行api调用的代码: public void sendRequests() { // using RxJava to make server polling. startPol

我在RxJava中遇到了一个奇怪的问题:生产者(API请求)发出事件的速度太快,消费者(API响应)只得到API请求的第二个响应

假设我有几个请求需要发送到服务器以查询数据库,因为来自服务器的一些查询需要一些时间。因此,当我得到响应时,可能第二个请求首先返回,奇怪的是,有时我没有得到第一个请求的响应

进行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()的观测值?

根据我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问题,服务器确实在每种情况下都返回响应?这里似乎有独立的观测流。