我是否需要处置()使用LiveDataReactiveStreams创建的发布者

Gus*_*son 8 android memory-leaks rx-java2 android-livedata android-architecture-components

假设我有一个Flowable,它在应用程序的不同部分之间共享.

在我想要观察它的每个片段中,我将其转换为LiveData LiveDataReactiveStreams.fromPublisher以避免泄漏和崩溃.我现在有一个包装我的Flowable的LiveData.

然后我将LiveData传递给我的ViewModel(在ViewModelFactory中).据我了解,我可以继续使用LiveData而不用担心泄漏.

现在,我不想直接观察LiveData,而是试图将它转换回Flowable with LiveDataReactiveStreams.toPublisherFlowable.fromPublisher,而是订阅Flowable.这是一个Flowable,它包装了一个包装Flowable的LiveData

我的问题是:我是否要担心处理此Flowable的订阅?我希望LiveData会充当"障碍",防止我的上下文泄漏回根Flowable,但我不太确定.

换一种说法:

  1. Flowable A存在于全局上下文中
  2. 在每个片段中,A被包装在LiveData B中,该数据被设置为片段ViewModel的属性
  3. 通常我会观察LiveData B,而是将其包装在Flowable C中
  4. 我订阅Flowable C并忽略退回的一次性用品

当碎片被破坏时,在C中访问的视图是否泄漏到A

tyn*_*ynn 2

考虑到当前的实现,您仍然需要手动维护订阅。生命周期仅用于处理实时数据的观察。

mLiveData.observe(mLifecycle, LiveDataSubscription.this);
Run Code Online (Sandbox Code Playgroud)

仅当请求非正数的项目并发送错误时,观察才会自动取消。然后这将处理订阅。由于生产者永远不会完成,它永远不会自行处置订阅,因此如果您不自己处置订阅,您就会泄漏订阅。

  • 如果我理解正确的话,如果您将副作用内联到流中,您可能永远不会 GC 片段。如果您不这样做,则片段中对发布者或一次性的引用甚至不应该是唯一的引用,因此流保持活动状态。这就是为什么您必须始终在 Android 生命周期内的某个地方处置订阅。 (2认同)