为什么只有最新的订阅者在 Android 使用 Kotlin 和 RxMVP 在 RxJava 中获得 onNext 事件
Why does only the latest Subscriber get onNext Event in RxJava on Android using Kotlin and RxMVP
给定以下场景:
一个 View
有一个 CheckBox
和多个 EditText
View
使用 Jake Wharton's RxBinding 提供对 Observables
的访问,就像这样
fun observeUsername(): InitialValueObservable<CharSequence> = RxTextView.textChanges(et_username)
用于 EditText
(其中三个,用于用户名、密码和电子邮件)和
fun observeSignUpCheckBox(): InitialValueObservable<Boolean> = RxCompoundButton.checkedChanges(cb_sign_up)
为 CheckBox
Presenter
为每个 EditText
提供一种方法,它与
一样简单
fun observeUsernameText(): Disposable {
return view.observeUsernameText()
.skipInitialValue()
.map { username -> StringUtils.isValidUsername(username.toString()) }
.subscribe({ view.setValidUsername(it) })
}
和 CheckBox
的一种方法:
fun observeSignUpCheckBox(): Disposable {
return view.observeSignUpCheckBox()
.subscribe({ checked ->
Timber.d("### view trigger")
})
}
所有这些方法都在 Presenter
的 onCreate
中调用,一切都按预期工作。
现在的问题是:
我在 Presenter
中添加了一个新函数来验证用户输入:
fun observeInputFields(): Disposable {
val email = view.observeEmailText().map { email -> StringUtils.isValidEmail(email.toString()) }
val password = view.observePasswordText().map { password -> StringUtils.isValidPassword(password.toString()) }
val signUp = view.observeSignUpCheckBox()
val username = view.observeUsernameText().map { username -> StringUtils.isValidUsername(username.toString()) }
return Observable.combineLatest(email, password, signUp, username,
Function4<Boolean, Boolean, Boolean, Boolean, Boolean> { validEmail, validPassword, signUpChecked, validUsername ->
validEmail && validPassword && (!signUpChecked || signUpChecked && validUsername)
})
.subscribe({ validForm ->
Timber.d("### form trigger")
view.enableContinue(validForm)
})
}
每当我更改 EditText
的内容时,Subscriptions
(EditText
的内容和 observeInputFields
中添加的合并内容)都会按预期收到事件.
但是,如果我点击 CheckBox
只有最后一个 Subscription
收到事件 取决于 onCreate
中函数的顺序。
fun onCreate() {
// here the logs only show '### form trigger'
disposables.add(observeSignUpCheckBox())
disposables.add(observeInputFields())
// ... omitted for clarity
}
或
fun onCreate() {
// here the logs only show '### view trigger'
disposables.add(observeInputFields())
disposables.add(observeSignUpCheckBox())
// ... omitted for clarity
}
我不明白为什么这种奇怪的事情只发生在 CheckBox
而不是发生在 EditText
身上。这非常令人困惑...
非常感谢您的帮助,因为我目前正卡在这个问题上:(
谢谢!
给定以下场景:
一个 View
有一个 CheckBox
和多个 EditText
View
使用 Jake Wharton's RxBinding 提供对 Observables
的访问,就像这样
fun observeUsername(): InitialValueObservable<CharSequence> = RxTextView.textChanges(et_username)
用于 EditText
(其中三个,用于用户名、密码和电子邮件)和
fun observeSignUpCheckBox(): InitialValueObservable<Boolean> = RxCompoundButton.checkedChanges(cb_sign_up)
为 CheckBox
Presenter
为每个 EditText
提供一种方法,它与
fun observeUsernameText(): Disposable {
return view.observeUsernameText()
.skipInitialValue()
.map { username -> StringUtils.isValidUsername(username.toString()) }
.subscribe({ view.setValidUsername(it) })
}
和 CheckBox
的一种方法:
fun observeSignUpCheckBox(): Disposable {
return view.observeSignUpCheckBox()
.subscribe({ checked ->
Timber.d("### view trigger")
})
}
所有这些方法都在 Presenter
的 onCreate
中调用,一切都按预期工作。
现在的问题是:
我在 Presenter
中添加了一个新函数来验证用户输入:
fun observeInputFields(): Disposable {
val email = view.observeEmailText().map { email -> StringUtils.isValidEmail(email.toString()) }
val password = view.observePasswordText().map { password -> StringUtils.isValidPassword(password.toString()) }
val signUp = view.observeSignUpCheckBox()
val username = view.observeUsernameText().map { username -> StringUtils.isValidUsername(username.toString()) }
return Observable.combineLatest(email, password, signUp, username,
Function4<Boolean, Boolean, Boolean, Boolean, Boolean> { validEmail, validPassword, signUpChecked, validUsername ->
validEmail && validPassword && (!signUpChecked || signUpChecked && validUsername)
})
.subscribe({ validForm ->
Timber.d("### form trigger")
view.enableContinue(validForm)
})
}
每当我更改 EditText
的内容时,Subscriptions
(EditText
的内容和 observeInputFields
中添加的合并内容)都会按预期收到事件.
但是,如果我点击 CheckBox
只有最后一个 Subscription
收到事件 取决于 onCreate
中函数的顺序。
fun onCreate() {
// here the logs only show '### form trigger'
disposables.add(observeSignUpCheckBox())
disposables.add(observeInputFields())
// ... omitted for clarity
}
或
fun onCreate() {
// here the logs only show '### view trigger'
disposables.add(observeInputFields())
disposables.add(observeSignUpCheckBox())
// ... omitted for clarity
}
我不明白为什么这种奇怪的事情只发生在 CheckBox
而不是发生在 EditText
身上。这非常令人困惑...
非常感谢您的帮助,因为我目前正卡在这个问题上:(
谢谢!