android - rxjava android retryWhen 在上次尝试时没有调用 onError

标签 android android-activity rx-java

我有这段代码可以尝试连接到 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/

相关文章:

android - 从主要 Activity (按钮)启动 map View

java - 如何锁定线程直到 Observable 完成

java - RxJava-我的运算符(operator)上缺少Back压异常?

android - 错误 :Cannot change dependencies of configuration ':app:_debugAnnotationProcessor' after it has been resolved

Android 在应用程序中保持屏幕开启

android - 在 android 中帮助编辑文本

android - 来自多个改造请求的 Observable<List<SomeItems>

android - 从 Android 中的未绑定(bind)服务获取数据

android - 在 Activity 中获取 bundle 的旧数据

支持 v7 TestActivity 的 Android ClassNotFoundException