为什么只有最新的订阅者使用Kotlin和RxMVP在Android上的RxJava中获取onNext事件

时间:2017-10-02 21:33:40

标签: android rx-java rx-android android-mvp rx-binding

考虑以下情况:

View CheckBoxEditText个。{ View可以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")
            })
}

onCreate的一种方法:

Presenter

所有这些方法都在Presenter的{​​{1}}中调用,一切都按预期工作。

现在问题:
我在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的内容EditTextobserveInputFields的内容和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而不是{{1}}。这非常令人困惑......

我非常感谢任何帮助,因为我目前仍然坚持这一点:(

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您检查库herehere的源代码,您将看到您所描述的内容是预期的行为。对于CompoundButton,您一次只能有一个Observable,但TextView倍。

如果您想更进一步,可以看到here要创建Observable,您需要使用setOnCheckedChangeListener CompoundButton替换可能的现有侦听器每次。

另一方面,对于TextView,您可以添加多个TextWatchers并单独删除每个onDispose