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

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

现在的问题是:
我在 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 的内容时,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 身上。这非常令人困惑...

非常感谢您的帮助,因为我目前正卡在这个问题上:(

谢谢!

如果您检查库的源代码 here and here,您会发现您所描述的是预期的行为。对于 aCompoundButton 你一次只能有一个 Observable 但对于 aTextView 多个。

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

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