web-dev-qa-db-ja.com

Dagger 2のコンポーネント、モジュール、スコープのライフサイクル

ダガー2に関する多くの投稿とチュートリアルを読みました。

http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/

https://github.com/codepath/Android_guides/wiki/Dependency-Injection-with-Dagger-2

http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-Android/

https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2

Dagger 2のコンポーネント(オブジェクトグラフ)のライフサイクルを決定するものは何ですか?

等.

しかし、私はまだコンポーネントのライフサイクル、およびそれがモジュールとスコープにどのように関連するかについて混乱しています。シングルトンだけが必要なときに、オブジェクトの複数のインスタンスを作成しないようにしたいと思います。誰かがこれらにいくつかの光を当てることができることを願っています:

アプリケーションクラスに組み込まれているコンポーネントのライフサイクルは何ですか?

ActivityクラスまたはFragmentクラスに組み込まれているコンポーネントのライフサイクルは何ですか?

コンポーネントからシングルトンインスタンスが必要な場合、@ Singletonまたはカスタムメイドのスコープでコンポーネントに注釈を付け、そのコンポーネントをアプリケーションクラスでビルドする必要がありますか?

アプリケーションクラスでコンポーネントをビルドする場合、それは、このコンポーネントを通じて利用可能なすべてのオブジェクトインスタンスが、アプリが強制終了または再起動されるまで、アプリ全体でシングルトンインスタンスになることを意味しますか?

@ActivityScopeなどのカスタムスコープを持つコンポーネントがあり、そのコンポーネントをアクティビティで構築します。このコンポーネントを通じて注入されたオブジェクトインスタンスは、このアクティビティのonDestroy()が呼び出された後に自動的に破棄されますか?

ここでも、カスタムスコープを持つコンポーネントがあります。たとえば、@ ActivityScopeとします。ActivityAとActivityBでこのコンポーネントを構築します。ActivityAとActivityBは、このコンポーネントの同じオブジェクトインスタンスを共有しますか、それとも同じオブジェクトの独自のインスタンスを持ちますか?

41
s-hunter

どうやってそれを理解する:

また、2つの点に注意してください(最初に1を読んだとき)。

1)コンポーネントは、必要な限り、またはコンポーネントを作成したクラスが破棄されない限り存続します(Androidアクティビティまたはフラグメントなど)

2)注釈を付けない場合は、メソッドに注釈を付けます(コンポーネントの注釈と同じでなければなりません)。要求するたびに新しいオブジェクトが作成されます

アプリケーションクラスに組み込まれているコンポーネントのライフサイクルは何ですか?

アプリケーションクラスに組み込まれたコンポーネントは、必要なだけ存続します。つまり、Androidアプリケーションクラスを拡張するクラスで作成する限り、いつでも作成および削除できます(これにより、コンポーネントオブジェクトはAndroidアプリは実行中です)組み込みのアクティビティクラスのコンポーネントとは対照的です-方向が変わるなどして破棄される可能性があるため、アクティビティが存続している限り存続します。何らかの理由でApplicationクラスのonCreate()メソッドでApplicationComponentを作成しなかった場合(たとえば、後で何かが発生したときに作成した場合)は、Android OSのときに破棄(null)できることに注意してください。メモリが少なく、ユーザーがアプリを閉じた後、ユーザーがアプリに戻ったとき(最後に表示されていたアクティビティに)、以前に強制終了されたときにアプリコンポーネントに何かを実行するように依頼し、nullでないかどうかを確認します

ActivityクラスまたはFragmentクラスに組み込まれているコンポーネントのライフサイクルは何ですか?

上記の回答で部分的に回答しました。 Fragment/Activity内にコンポーネントを作成した場合、向きが変わったりメモリが不足したりして、アクティビティやフラグメントが破壊されない限り、コンポーネントは存続します。

コンポーネントからシングルトンインスタンスが必要な場合、@ Singletonまたはカスタムメイドのスコープでコンポーネントに注釈を付け、そのコンポーネントをアプリケーションクラスでビルドする必要がありますか?

このシングルトンをどこで使用するかによって異なります。単一のアクティビティでシングルトンが必要な場合は、たとえば@ActivityScopeアノテーションを作成し、このアノテーションを使用してメソッドとActivityComponentにアノテーションを付けることができます。次に、onCreate()アクティビティメソッド内にActivityComponentを作成し、アクティビティが存続する限りシングルトンを保持します(同じアクティビティの異なるフラグメント間でシングルトンを共有する予定がある場合に役立ちます)。アプリ内の異なるアクティビティ/フラグメント間のシングルトンが必要な場合は、それをAppModuleで作成し、メソッドとアプリコンポーネントにシングルトンアノテーションを付けてアノテーションを付けるのが最善の方法です。

アプリケーションクラスでコンポーネントをビルドする場合、それは、このコンポーネントを通じて利用可能なすべてのオブジェクトインスタンスが、アプリが強制終了または再起動されるまで、アプリ全体でシングルトンインスタンスになることを意味しますか?

@Singletonアノテーションを使用してメソッドに注釈を付けると、はい

@ActivityScopeなどのカスタムスコープを持つコンポーネントがあり、そのコンポーネントをアクティビティで構築します。このコンポーネントを通じて注入されたオブジェクトインスタンスは、このアクティビティのonDestroy()が呼び出された後に自動的に破棄されますか?

はい

ここでも、カスタムスコープを持つコンポーネントがあります。たとえば、@ ActivityScopeとします。ActivityAとActivityBでこのコンポーネントを構築します。ActivityAとActivityBは、このコンポーネントの同じオブジェクトインスタンスを共有しますか、それとも同じオブジェクトの独自のインスタンスを持ちますか?

彼らは独自のインスタンスを持っています

35