我有这段代码可以尝试连接到 xmpp 服务器。一切正常,除了最后一次尝试连接时,没有在订阅者上调用 onError,根据文档,它应该。我做错了什么?
@Override
public void connect(final AbstractXMPPConnection connection) {
Observable.<AbstractXMPPConnection>create(subscriber -> {
try {
connection.connect();
} catch (SmackException | IOException | XMPPException e) {
e.printStackTrace();
subscriber.onError(e);
}
})
.retryWhen(attempts -> attempts.zipWith(Observable.range(1, 4), (n, i) -> i).flatMap(i -> {
return Observable.timer(i, TimeUnit.SECONDS);
}))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<AbstractXMPPConnection>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (callback != null)
callback.onFailedConnecting();
}
@Override
public void onNext(AbstractXMPPConnection conn) {
if (callback != null)
callback.onConnected();
}
});
}
TLDR:在最后一次尝试中,应该调用 public void onError 而不是
最佳答案
你有:
.retryWhen(attempts -> attempts.zipWith(Observable.range(1, 4), (n, i) -> i).flatMap(i -> {
return Observable.timer(i, TimeUnit.SECONDS);
}))
此代码永远不会发出错误,因此它将以指数方式(计时器)尝试重试,但永远不会失败。因此永远不会调用 onError()。
如果您想捕获错误,您需要使用显式 Observable.error() 从 retryWhen 传递错误,或者删除 retryWhen 部分。 :)
关于android - rxjava android retryWhen 在上次尝试时没有调用 onError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30891030/