RxJava2中Observer和DisposableObserver的区别

bei*_*rad 2 reactivex rx-java2

我知道DisposableObserver已经实现了ObserverDisposable。标记onSubscribe()方法为final并提供onStart()而不是它。

但我不明白这两者在行动上有什么区别。我什么时候应该使用Observeror DisposableObserver

能否请您谈谈使用它们的优缺点?

sey*_*ari 5

观察者的普通 onSubscribe 方法可以调用多少次,只要您使用同一个观察者。但是 withDisposableObserver onSubscibe方法只能被调用一次,这意味着你只能使用DisposableObserver一次。如果您将单个对象传递DisposableObserver给两个流,它将抛出异常并快速关闭它们。此逻辑已在onSubscribe()此类中实现,因此您无法覆盖它。但是如果您需要onSubscribe()回调,您可以覆盖onStart()相同的方法。

这个类的用法可以如下。

根据文档,一个 DisposableObserver 是:

一个抽象的观察者,通过实现 Disposable 允许异步取消。

换句话说,这意味着您可以在观察者方法中使用一次性行为。就像调用dispose()onNext()

Observable.just(1, 2, 3, 4, 5)
        .map {
            "$it"
        }
        .subscribe(object : DisposableObserver<String>(){
            override fun onComplete() {
            }

            override fun onNext(t: String) {
                println("first item only= $t")

                //we can dispose this stream right in the observer methods
                dispose()
            }

            override fun onError(e: Throwable) {
            }

        })
Run Code Online (Sandbox Code Playgroud)

人们甚至可以结合DisposableObserver使用subscribeWith()以获得与普通观察者几乎相同的行为。

val disposableObserver = object : DisposableObserver<String>() {
        override fun onComplete() {
        }

        override fun onNext(t: String) {
            println("first item only= $t")

            //we can dispose this stream right in the observer methods
            dispose()
        }

        override fun onError(e: Throwable) {
        }

    }

    val disposable: Disposable = Observable.just(1, 2, 3, 4, 5)
        .map {
            "$it"
        }
        .subscribeWith(disposableObserver)

    disposable.dispose()
Run Code Online (Sandbox Code Playgroud)

这个和 RX-Java 中的许多其他类和运算符都可以简化 RX 的使用,并且可以根据您想要如何使用库来选择它们中的任何一个。