RxAndroid重新订阅Observable onError和onComplete

时间:2017-10-03 18:35:45

标签: android rx-java observable rx-android

我的问题可能更多是概念性的 我通过Observable合同获得该结果,ObservableonComplete被调用后onError将不再发出任何内容。
但是我使用的是RxBindings for Android,因此它不是"我的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这两个因素导致我再也无法重复使用该按钮订阅结束 有办法规避这种行为吗? 因为发生错误我希望能够重试 此外,我希望能够发送多个忘记密码的电子邮件。

1 个答案:

答案 0 :(得分:1)

您可以使用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")
            })
}