android - RxAndroid 重新订阅 Observable 的 onError 和 onComplete

标签 android rx-java observable rx-android

我的问题可能更多是概念性的。
我通过 Observable 契约(Contract)了解到,在 onCompleteonError 被调用后,我的 Observable 将不再发出任何项目。
但我使用的是适用于 Android 的 RxBindings,因此它不是“我的 Observable”,而是点击 Button 发出的项目。

fun observeForgotPasswordButton(): Disposable {
    return view.observeForgotPasswordButton()
            .flatMap {
                authService.forgotPassword(email).toObservable<Any>()
            }
            .subscribe({
                // on next
                Timber.d("fun: onNext:")
            }, { error ->
                // on error
                Timber.e(error, "fun: onError")
            }, {
                // onComplete
                Timber.d("fun: onComplete")
            })
}

observeForgotPasswordButton() 返回一个 Observable

fun observeForgotPasswordButton(): Observable<Any> = RxView.clicks(b_forgot_password)

问题是 authService.forgotPassword(email) 是一个 Completable,它会调用 onCompleteonError 两者都导致订阅结束后我不能再重复使用该按钮。
有没有办法规避这种行为? 因为在发生错误时我希望能够重试。
此外,我希望能够发送多封忘记密码的电子邮件。

最佳答案

您可以使用retry()repeat() 运算符来自动重新订阅原始的Observable(或Completable)。

fun observeForgotPasswordButton(): Disposable {
    return view.observeForgotPasswordButton()
            .flatMap {
                authService.forgotPassword(email).toObservable<Any>()
            }
            .repeat() // automatically resubscribe on completion
            .retry()  // automatically resubscribe on error
            .subscribe({
                // on next
                Timber.d("fun: onNext:")
            }, { error ->
                // on error
                Timber.e(error, "fun: onError")
            }, {
                // onComplete
                Timber.d("fun: onComplete")
            })
}

关于android - RxAndroid 重新订阅 Observable 的 onError 和 onComplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551243/

相关文章:

android - 将 Kotlin 从 1.2.31 升级到 1.2.41/1.2.50 后出现 NoClassDefFoundError

android - Rx-java 是按引用传递还是按值传递?

Typescript 使用 Observable.of 区分联合类型

android - 使用 HttpURLConnection 发布包含其他表单数据的文件

java - 非空对象类型上的 Retrofit-Kotlin NullPointerException

android - 如何提供具有 Dagger 依赖项的 Activity 上下文?

javascript - Angular8 - 无法迭代对象

java - Apache Flink 测试中是否有像 Reactor 和 RxJava 中那样的虚拟时间概念

reactive-programming - 如何在 rxjava 中 Hook 可观察的延迟订阅

rxjs - 为什么 Rx 中没有 endWith 运算符?