Rxjava - 热门观察

时间:2017-04-19 20:17:42

标签: rx-java

当生产者(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?

1 个答案:

答案 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()