这个问题与Android和生命周期有关。 以前,我会有一系列的主题,并在创作时订阅它们。
销毁后,我会将所有主题标记为完整,假设它处理了所有订阅者。
在 Android Studio 3.1 中,我会收到任何"未使用"订阅者的警告。解决方案是将它们添加到"可完成的一次性用品"中,然后在销毁时进行处理。
"复合一次性"是否只需要在销毁时正确取消请求?我以前将主题标记为完整的方法是否做了什么,在这种情况下有必要吗?
作为代码示例:
val observable: PublishSubject<Int> = PublishSubject.create()
val disposable = observable.subscribe { /* subscription */ }
fun onDestroy() {
observable.onComplete() // is this line necessary or helpful?
disposable.dispose()
}
observable.onComplete()
将完成您的流,因此将此事件触发给所有侦听onComplete
的订阅者,您无需在 onComplete 之后释放流(这是自动完成的(。
disposable.dispose()
将停止流,并且不会触发任何完整事件。
如果你不听完整的事件,两者都是一样的,所以要回答你的问题,你不需要这两行。
在 onDestroy 上执行此操作不是一个好主意,因为片段/活动停止和销毁之间存在间隔。如果可观察对象在该间隙期间触发,则很可能会执行一些会导致异常的 UI 工作,因为您尝试在活动/片段停止后操作 UI 对象。
更好的方法是将此业务逻辑卸载到视图模型,然后 UI 通过 LiveData 侦听来自视图模型的更新(它本身是生命周期感知的,因此它会根据需要负责订阅/取消订阅(。然后,您在此处显示的代码将被移动到视图模型的 onCleared 方法中。
检查这个和这个以供参考。