【发布时间】:2017-10-03 18:35:45
【问题描述】:
我的问题可能更多是概念性的。
我通过Observable 合同得知,在调用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,这两者都导致我无法再重复使用该按钮,因为订阅结束了。
有没有办法规避这种行为?
因为在发生错误时我希望能够重试。
此外,我希望可以发送多个忘记密码的电子邮件。
【问题讨论】:
-
过早取消订阅上述内容的唯一方法是发生错误。如果 forgotPassword 总是成功,我认为不会调用 onComplete 。检查 rxJava error handling operators。你也可以使用
flatMapCompletable -
我做了更多的挖掘,发现了一个pretty solid explanation of error handling in rx。正如博客文章所描述的那样,我犯了一个新手错误,即在
authService中抛出异常,而不是在错误状态下调用onNext。这是 rx 方式... -
@grAPPfruit 使用 onError 而不是对错误状态建模并不是真正的
rookie错误。甚至 Square 的 Retrofit 也做过一次。 -
@PhoenixWang 成就了我的一天 ;)
标签: android rx-java observable rx-android