2014-09-02 70 views
40

我在我的Fragment中使用RxJava ReplaySubject如果对RxJava主题进行onComplete调用,是否需要再次手动取消订阅?

我试图以一种方式使用ReplaySubject,我希望主体执行一个进程直到完成(可能超出片段的生命期)。

完成该过程后,我想释放资源 - 据我了解 - 通过在注册观察者(在我的情况下,是主题本身)时取消订阅来完成。

在这种github issue thread @benjchristensen说:

如果它是可观察到的,那么它应该发出onCompleted和完成。

如果它是一个观察者,那么当它调用Observable.subscribe时,它应该取消订阅它收到的订阅,它将使Observable有机会关闭和清理。

如果它是一个主题 - 既是观察者又是观察者 - 这是什么行为?如果我在主题上调用onComplete,这是否意味着订阅已停止,因此我无需手动取消订阅通过注册观察者获得的订阅?

回答

56

主题是Observable顶部的相对较薄的图层,它允许您从Observable外部的源调用onNext(),onCompleted()onError()调用。他们的退订行为与Observable相同。如果在主题上调用onCompleted()onError(),订阅者将被取消订阅。从Observable.subscribe()返回的订阅无需致电unsubscribe()

对于ReplaySubject,请注意,在垃圾收集之前资源不会被清理。即使onCompleted()已在ReplaySubject上被呼叫,订户仍然可以订阅,并且它将接收在订阅之前进行的全部原始onNext(),onCompleted()onError()调用。

+0

ReplaySubject上的好点。 – 2014-09-04 08:05:15

+0

这是否也适用于.cache和.replay转换的observables? – Zardoz 2016-07-15 14:23:55

+1

这是在文档中提到的地方吗?我在今天花了1个小时才找到这个线程。 – 2017-02-08 16:38:39