0

所以我想使用 rx-java2 进行表单验证。我正在使用科特林。我遇到了两个问题。emailObservable 和 passwordObservable 都是 type Disposable!。我试图通过调用来指定类型,val emailObservable: Observable<Boolean>但 Android Studio 认为它的Disposable!.

其次,当我想使用方法时,combineLatest我得到了一个错误:以下函数都不能用提供的参数调用。

emailObservable 和 passwordObservable 都可以正常工作。我是 rx-java 的新手,我对这种类型的东西感到困惑。

val emailObservable = RxTextView.afterTextChangeEvents(textEmail)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textEmail.text.length > 3 }
                .subscribe { x -> foo(x) }

val passwordObservable =RxTextView.afterTextChangeEvents(textPassword)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textPassword.text.length > 5 }
                .subscribe { x -> foo(x) }


Observable.combineLatest(emailObservable,
passwordObservable,
BiFunction { x: Boolean, y:Boolean -> x && y })
4

1 回答 1

5

关于DisposablevsObservable实际上编译器/IDE是正确的。该subscribe方法在 an 上调用Observable并返回 a Disposable,即您可以Observable在它完成之前取消订阅的东西(类似于“取消”)。

然后,当您提供 2秒时,该combineLatest方法预计会被调用2秒。要解决这个问题,你不应该直接在链中调用,而是在.ObservableDisposablesubscribecombineLatest

例子:

fun main(args: Array<String>) {
    val first = Observable.intervalRange(1, 10, 0, 2, TimeUnit.SECONDS)
    val second = Observable.intervalRange(10, 20, 0, 1, TimeUnit.SECONDS)

    Observable.combineLatest(arrayOf(first, second)) {
        "${it[0]} -> ${it[1]}"
    }.blockingSubscribe() {
        println(it)
    }
}

输出:

1 -> 10
1 -> 11
2 -> 11
2 -> 12
2 -> 13
...
于 2018-03-15T18:14:02.183 回答