我有一个rx方法来进行api调用,这个方法的调用者可能会在很短的时间内多次发生。所以rx方法将是
public void apiCallWithRx() {
apiService.makeApiCall()
.subscribeOn(Schecdulars.io())
.observeOn(AndroidSchedulers.mainTread())
.subscribe(
// onNext
new onConsume(),
// onError
new onConsume(),
);
}
调用方法可以在短时间内多次调用此apiCallWithRx。 但问题是,在第二次或任何特定时间打电话时,我有时无法得到来自下流的响应。 onNext,onError或onComplete都不会被调用。 我想知道,这是因为缓冲还是背压...... 尝试使用rxjava1和rxjava2,它们是相同的。
对于任何建议,我将不胜感激。
更新1
我没有看到任何背压异常,所以它不能成为背压问题。
更新2
请忽略细节,Rx代码大部分时间都有效。我刚刚省略了一些用于说明目的的代码
更新3
我在后台有一个BlockingQueue,所以当队列中有可用数据时,实际上会调用此rx方法。可以随时将数据添加到队列中。并且这个rx方法是不异步调用,因为这个方法只在第一个响应之后被调用,然后检查队列,如果有数据,那么我们发送第二个api请求。
答案 0 :(得分:0)
Observable
是懒惰的,您必须subscribe
才能运行Observable
。
答案 1 :(得分:0)
我不知道为什么在RxJava2中可以使用 subscribeOn 和 observerOn 运算符,而无需指定必须执行它的线程。
但至少在RxJava1中,如果使用这些运算符,则异步运行它,然后必须等待执行才能得到结果。
检查此测试
@Test
public void testObservableAsync() throws InterruptedException {
Subscription subscription = Observable.from(numbers)
.doOnNext(increaseTotalItemsEmitted())
.subscribeOn(Schedulers.newThread())
.subscribe(number -> System.out.println("Items emitted:" + total));
System.out.println("I finish before the observable finish. Items emitted:" + total);
new TestSubscriber((Observer) subscription)
.awaitTerminalEvent(100, TimeUnit.MILLISECONDS);
}
您可以在此处查看另一个示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java