为什么只有最新的订阅者使用Kotlin和RxMVP才能在Android上的RxJava上进行下一个事件
鉴于以下情况:
以CheckBox
和多个EditText
为特色的View
该View
使用杰克·沃顿的RxBinding来访问Observables
对象
fun observeUsername(): InitialValueObservable = RxTextView.textChanges(et_username)
对于EditText
(有三个,用户名,密码和电子邮件)和
fun observeSignUpCheckBox(): InitialValueObservable = 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
中添加了一个用于validation用户输入的新函数:
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 { 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
。 这是非常混乱的…
任何帮助非常感谢,因为我目前卡住在:(
谢谢!
如果你在这里和这里检查库的源代码,你会看到你所描述的是预期的行为。 对于CompoundButton
,一次只能有一个Observable
,但是对于TextView
多个。
如果你想更进一步,你可以看到在这里创建Observable
你需要使用setOnCheckedChangeListener
上的setOnCheckedChangeListener
,每次替换可能存在的侦听器。
另一方面,对于TextView
您可以添加多个TextWatchers
并分别在onDispose
删除每个onDispose
。