假设我有以下代码:
retryWhen
我希望它会执行,因为Observable.error(new Throwable()).
retryWhen(notificationHandler -> Observable.create(subscriber -> {
log("never");
}).observeOn(Schedulers.newThread())).
subscribe(x -> {}, t -> log("err"), () -> log("completed"));
永远不会重新订阅或完成。
但是当我运行它时,应用程序停止,甚至没有指示错误或竞争。
为什么它永远不会持续?
P.S。我有想法,执行中断因为它都在单线程上运行。并尝试将retryWhen()处理程序移动到另一个线程:
A=sparse(b(:,1),b(:,2),1,10,10);
但它没有帮助 - 仍打印'永不'并停止。
答案 0 :(得分:0)
请通过以下链接查看Dan的解释:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/
确实说
让我们先看看最后一部分。返回的Observable的排放确定是否发生重新订阅。如果它发出onCompleted或onError,那么它不会重新订阅。但是如果它发出onNext则会发生(不管onNext中的实际内容是什么)。
重试当订阅Observable.never()时,它不提供任何值。因此,管道处于停滞状态,您的申请将不会继续。您可以抛出e on / error或on值:
让我们来看看这个测试。它表明不会发出任何值,也不会重新订阅。
@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();
}
我希望,它会持续执行,因为重试时永远不会重新订阅或完成。但是当我运行它时,应用程序停止,甚至没有指示错误或竞争。
应用程序没有指明任何内容,因为从未到达订阅onComplete / onError,因为Observable.never()。
答案 1 :(得分:0)
首先,我认为您对Observable.never
和Observable.empty
感到困惑。当您使用Observable.never
时,它不会重试(notificationHandler
已消耗错误)。
其次,当您使用retryWhen
时,您应该订阅给定的notificationHandler
。或者它会在订阅时立即重试(订阅时将调用参数Func1<> notificationHandler
,并在返回Observable emit项时重试)。