处置可观察物
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 方法。
observable.onComplete()
将完成您的流,因此向所有监听 onComplete
的订阅者触发此事件,您不需要在 onComplete 之后处理流(这是自动完成的)。
disposable.dispose()
将停止流并且不会触发任何完成事件。
如果您没有收听 complete 事件,则两者是相同的,因此要回答您的问题,您不需要这两行。
这个问题与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 方法。
observable.onComplete()
将完成您的流,因此向所有监听 onComplete
的订阅者触发此事件,您不需要在 onComplete 之后处理流(这是自动完成的)。
disposable.dispose()
将停止流并且不会触发任何完成事件。
如果您没有收听 complete 事件,则两者是相同的,因此要回答您的问题,您不需要这两行。