处置可观察物

时间:2018-09-16 20:51:50

标签: android rx-java2 rx-kotlin2

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

2 个答案:

答案 0 :(得分:0)

在onDestroy上执行此操作不是一个好主意,因为片段/活动停止的时间和销毁的时间之间存在一定的差距。如果您在这段间隔内观察到火灾,您很可能会做一些UI工作,这会导致异常,因为您尝试在活动/片段停止后尝试操作UI对象。

更好的方法是将该业务逻辑卸载到视图模型,然后UI通过LiveData侦听该视图模型的更新(它本身具有生命周期意识,因此可以根据需要进行预订/取消预订)。您在此处显示的代码随后将移至视图模型的onCleared方法。

检查thisthis以供参考。

答案 1 :(得分:0)

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

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

如果您不是在听完整事件,则两者是相同的,因此回答您的问题就不需要这两行。