我的问题可能更多是概念性的。
我通过 Observable
契约(Contract)了解到,在 onComplete
或 onError
被调用后,我的 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
,它会调用 onComplete
或 onError
两者都导致订阅结束后我不能再重复使用该按钮。
有没有办法规避这种行为?
因为在发生错误时我希望能够重试。
此外,我希望能够发送多封忘记密码的电子邮件。
最佳答案
您可以使用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/