假设我有以下代码:
Observable.error(new Throwable()).
retryWhen(notificationHandler -> Observable.never()).
subscribe(x -> {}, t -> log("error"), () -> log("completed"));我期望,它将保持执行,因为retryWhen永远不会重新提交到或完成。
但当我运行它时,应用程序停止了,甚至没有指示错误或竞争。
为什么它永远不会存在?
附言:我有这样的想法,那就是执行中断,因为它都运行在单线程上。并尝试将retryWhen()处理程序移动到另一个线程:
Observable.error(new Throwable()).
retryWhen(notificationHandler -> Observable.create(subscriber -> {
log("never");
}).observeOn(Schedulers.newThread())).
subscribe(x -> {}, t -> log("err"), () -> log("completed"));但它没有帮助--仍然打印“从不”并停止。
发布于 2017-05-16 22:14:26
请在以下链接中查看来自Dan的解释:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/
上面确实写着
让我们先看看最后一部分。返回的可观察对象的发射决定是否发生重新订阅。如果它发出onCompleted或onError,那么它就不会重新订阅。但是如果它发出onNext,那么它就会发出(不管onNext中实际是什么)。
retryWhen订阅Observable.never(),而后者不提供任何值。因此,管道处于停滞状态,您的应用程序将无法继续运行。要么抛出e onError/ onComplete,要么只抛出一个值:
让我们来看看这个测试。它显示不会发出任何值,也不会重新订阅它。
@Test
void name2() throws Exception {
boolean await = Observable.error(new Throwable())
.doOnEach(objectNotification -> System.out.println("x"))
.retryWhen(notificationHandler -> Observable.never())
.map(o -> -42)
.doOnNext(System.out::println)
.test()
.await(100, TimeUnit.MILLISECONDS);
assertThat(await).isFalse();
}我期望,它将保持执行,因为retryWhen永远不会重新订阅to或
。但当我运行它时,应用程序停止了,甚至没有指示错误或竞争。
应用程序没有指示任何东西,因为由于Observable.never(),订阅onComplete/ onError永远不会到达。
发布于 2017-05-16 22:33:15
首先,我认为你把Observable.never和Observable.empty搞混了。当您使用Observable.never时,它将不会重试这两个已完成的错误(错误已被notificationHandler消耗)。
其次,当你使用retryWhen时,你应该在给定的notificationHandler上订阅。或者在subscribe时立即重试(subscribe时调用参数Func1<> notificationHandler,返回Observable发出项时重试)。
https://stackoverflow.com/questions/44002847
复制相似问题