6

アプリケーションのさまざまな部分で共有されるFlowableがあるとします。LiveDataReactiveStreamsを使用して作成したパブリッシャー

私はそれを観察したいところで、漏れやクラッシュを避けるためにLiveDataReactiveStreams.fromPublisherのLiveDataに変換します。私は今、自分のFlowableをラップするLiveDataを持っています。

次に、(ViewModelFactoryの)ViewModelにLiveDataを渡します。私が理解する限り、私は先に進み、漏れを心配することなくLiveDataを使用することができます。

LiveDataを直接観察するのではなく、LiveDataReactiveStreams.toPublisherFlowable.fromPublisherでFlowableに変換し、Flowableにサブスクライブしたいと思います。これは、現在、FlowableをラップするLiveDataをラップするFlowableです。

私の質問は:このFlowableへのサブスクリプションを処分することについて心配する必要はありますか?私の希望は、LiveDataが「障壁」として機能し、私のコンテキストがフロアブルのルートに漏れることを防ぐことですが、私はそのことについてはあまりよく分かりません。すなわち

  1. フロアブル各断片はグローバルコンテキスト
  2. に存在する、はフラグメントのプロパティとして設定されているLiveData Bに包まれているビューモデル
  3. 通常、私はLiveData Bを見ると、代わりにFlowableで囲みますC
  4. IはCを流動性フラグメントが破棄されるときまで漏れCにアクセス返さ使い捨て

ウィルビューを無視するようにサブスクライブ?

答えて

1

current implementationを考慮すると、依然としてサブスクリプションを手動で気にする必要があります。ライフサイクルは、ライブデータの観察を処理するためにのみ使用されます。

mLiveData.observe(mLifecycle, LiveDataSubscription.this); 

肯定的でない量のアイテムが要求され、エラーが送信された場合にのみ、観察は自動的にキャンセルされます。これにより、サブスクリプションが破棄されます。プロデューサーは決して完了しないので、サブスクリプションをそれ自体で処分することは決してないので、自分で処分しなければサブスクリプションを漏らすことになります。

+0

私はそれが私のために退会しないことを理解しますが、私の質問です:断片が破壊されたときに実際に漏れますか?もしそうなら、どこで/どのようにこのリークが起こるのでしょうか? –

+0

あなたのサブスクリプションがパブリッシャーにリークします。 – tynn

+0

私はこれまでのところあなたとお付き合いしていますが、フラグメントがGC:edの場合、パブリッシャーはGC:ed(サブスクリプションと一緒になりますか?私が見る限り、ここで作成されたすべての参照は循環的であり、漏れが起こらないようにするべきです(明らかに愚かなことをしない限り) –

関連する問題