RxJava2中Observer和DisposableObserver的区别

Difference between Observer and DisposableObserver in RxJava2

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

但是我不明白这两者在操作上有什么区别。什么时候应该使用 ObserverDisposableObserver?

您能说说使用它们的优缺点吗?

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

这个class的用法可以如下

根据文档,DisposableObserver 是:

An abstract Observer that allows asynchronous cancellation by implementing Disposable.

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

中调用 dispose()
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) {
            }

        })

甚至可以将 DisposableObserversubscribeWith() 结合使用,以获得与普通观察者几乎相同的行为。

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()

这个和 RX-Java 中的许多其他 classes 和运算符都是为了简化 RX 的使用,并且可以根据您希望如何使用库来选择其中的任何一个。