如果对 RxJava 主题进行 onComplete 调用,我是否需要手动取消订阅?

47

我在我的Fragment中使用了一个RxJava ReplaySubject

我想以一种方式使用ReplaySubject,在此期间,我希望Subject执行一个进程直到完成(可能超出片段的生命周期)。

在进程完成时,我想释放资源,这是通过取消订阅注册观察者时的订阅所完成的(在我的情况下,是主题本身)。

在这个github问题线程中,@benjchristensen说:

如果它是Observable,那么它应该发出onCompleted并完成操作。

如果它是Observer,则应该从它调用Observable.subscribe时收到的Subscription中取消订阅,并为Observable提供关闭和清理的机会。

如果它是一个既是Observer又是Observable的Subject,行为会怎样呢?如果我在主题上调用onComplete,是否基本上意味着停止订阅,因此我无需手动取消订阅通过注册观察者获得的订阅?

1个回答

64

Subjects是建立在Observable之上的一个相对较薄的层次,允许您从外部源中提供onNext()onCompleted()onError()的调用,并传递给Observable。它们的取消订阅行为与Observable相同。如果在Subject上调用了onCompleted()onError(),则订阅者将被取消订阅。不需要在从Observable.subscribe()返回的订阅上调用unsubscribe()

对于ReplaySubject,请注意,资源在垃圾回收之前不会被清除。即使在ReplaySubject上已经调用了onCompleted(),订阅者仍然可以订阅并接收到所有原始的onNext()onCompleted()onError()调用。


对于.cache和.replay转换后的observable,这也适用吗? - medihack
2
这个在文档中有提到吗?我今天在这个问题上浪费了整整一个小时,直到我找到了这个帖子。 - Deniss B.
@DenissB。我不记得在文档中看到过任何内容。就个人而言,我不依赖这种行为。我总是保存我的订阅,然后取消订阅,因为对已经取消订阅的订阅调用取消订阅没有任何效果。 - kjones
但是如果我需要重新订阅怎么办?主题已经完成,我无法再次连接它(只会返回onComplete)。你能给我建议吗? - Georgiy Chebotarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接