为什么只有最新的订阅者使用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") }) } 

所有这些方法都在PresenteronCreate中调用,一切按预期工作。

现在的问题:
我在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的内容, SubscriptionsEditText的一个和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