处置可观察物

Disposing of observables

这个问题与Android和生命周期有关。 以前,我会有一系列的主题,并在创建时订阅它们。

一旦销毁,我会将所有主题标记为完整,假设它处理所有订阅者。

使用 Android Studio 3.1,我会收到针对任何 "isn't used" 订阅者的警告。解决方案是将它们添加到一个 "completable disposable" 中,然后我将其销毁。

我需要 "composite disposable" 才能在销毁时正确取消请求吗?我以前将主题标记为完整的方法有什么用吗?在这种情况下是否有必要?

作为代码示例:

val observable: PublishSubject<Int> = PublishSubject.create()
val disposable = observable.subscribe { /* subscription */ }

fun onDestroy() {
    observable.onComplete() // is this line necessary or helpful?
    disposable.dispose()
}

在 onDestroy 上执行它不是一个好主意,因为在 fragment/activity 停止和销毁之间存在间隔。如果您的 observable 在那个间隙触发,您很可能会做一些 UI 会导致异常的工作,因为您试图在 activity/fragment 停止后操作 UI 对象。

更好的方法是将此业务逻辑卸载到视图模型,然后 UI 通过 LiveData 侦听来自视图模型的更新(它本身是生命周期感知的,因此它负责 subscribing/unsubscribing如所须)。您在此处显示的代码随后将移至视图模型的 onCleared 方法。

检查 this and this 以供参考。

observable.onComplete() 将完成您的流,因此向所有监听 onComplete 的订阅者触发此事件,您不需要在 onComplete 之后处理流(这是自动完成的)。

disposable.dispose() 将停止流并且不会触发任何完成事件。

如果您没有收听 complete 事件,则两者是相同的,因此要回答您的问题,您不需要这两行。