2017-08-10 14 views
0

私が理解しているように、コンポーネントとモジュールのスコープを設定すると、(@)提供されるインスタンスは、それらを公開するコンポーネントが存在する限り存続します。Dagger2カスタムスコープとコンポーネントを破棄します。

より具体的には、@ Userスコープコンポーネントの場合、ユーザーがログアウトするときにユーザー固有のデータが格納された@提供オブジェクト(モジュールによって提供される)を削除できます。新しいユーザーがログインすると、新しいDaggerコンポーネントが作成され、そのコンポーネントは、(新しくログインした)ユーザー固有のデータで表示されるオブジェクトを公開します。これらのオブジェクトは、ログアウト時にコンポーネントが破棄されない限り、生き続けることができます。

私の質問は単純に、ログアウト時に(サブ)コンポーネントをどのように破壊するのでしょうか?
コンポーネントをガベージコレクションできるようにnullに設定するだけで十分ですか?また、Builderを使用して手動で新しいコンポーネントを作成するだけで十分ですか?

答えて

1

あなた自身の後をきれいにする必要があります。コンポーネントを破棄してもスコープ付きオブジェクトは破棄されません。スコープ付きオブジェクトへの参照をコンポーネントのライフサイクルより長くしておくと、通常はメモリリークの原因になります。


ダガーはオブジェクトを注入または構築しますが、これらのオブジェクトを使用して行うことは、あなた次第です。 UserComponentから取得したUserオブジェクトを静的変数に保存する場合は、コンポーネントがガベージコレクトされた後でも使用できることは明らかです。

このような問題を防ぐには、ではなく、では、静的変数を使用し、短命のオブジェクトを長寿命のオブジェクトに渡すときに気を付けることをお勧めします。

UserScopedオブジェクトがある場合は、ユーザーがログアウトしたときにコンポーネントとともにリファレンスを削除しない限り、Applicationで参照することはお勧めできません。最も簡単なアプローチは、ユーザースコープのコンポーネントにアクセスしたすべてのフラグメント、サービス、アクティビティを受け取り、そのコンポーネントを保持しているアプリケーション/シングルトンをクリーンアップすることです。

あなたが「リーク」しないと任意の短い方が長く住んでいたものが、ガベージコレクタは、残りの世話をするためにオブジェクトが住んでいました。

0

コンポーネントへの参照がある限り、そのコンポーネントに属するオブジェクトグラフはメモリ内に存在します。ログインの

であれば、ユーザがログインしているように、依存性注入は、ユーザーセッション中に行うことができるように、コンポーネントへの参照を保持、コンポーネントスコープ。

あなたは依存関係は、例えば部品のために、一度だけ注入する場合、コンポーネントへの参照を保持する必要がある特定のアンドロイド活動に属していません。

関連する問題