1

这个问题与 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()
}
4

2 回答 2

3

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

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

如果您没有收听完整的事件,两者都是相同的,所以要回答您的问题,您不需要这两行。

于 2018-09-16T21:24:17.180 回答
1

在 onDestroy 上执行它不是一个好主意,因为在片段/活动停止和销毁之间存在间隙。如果您的 observable 在该间隙期间触发,您很可能会执行一些会导致异常的 UI 工作,因为您正在尝试在 Activity/Fragment 停止后操作 UI 对象。

更好的方法是将此业务逻辑卸载到视图模型,然后 UI 通过 LiveData 侦听来自视图模型的更新(它本身是生命周期感知的,因此它会根据需要处理订阅/取消订阅)。您在此处显示的代码将被移至视图模型的 onCleared 方法。

检查thisthis以供参考。

于 2018-09-16T21:09:51.500 回答