web-dev-qa-db-fra.com

Dagger 2 cycle de vie d'un composant, module et portée

J'ai lu de nombreux articles et tutoriels sur la dague 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

Qu'est-ce qui détermine le cycle de vie d'un composant (graphique d'objet) dans Dagger 2?

etc.

Mais je suis toujours confus au sujet du cycle de vie d'un composant et de sa relation avec le module et la portée. Je veux m'assurer de ne pas créer plusieurs instances d'un objet lorsque je veux uniquement un singleton. J'espère que quelqu'un pourra nous éclairer sur ces points:

Quel est le cycle de vie d'un composant intégré à la classe d'application?

Quel est le cycle de vie d'un composant intégré à la classe Activity ou Fragment?

Si je veux une instance singleton à partir d'un composant, dois-je annoter le composant avec @Singleton ou une étendue personnalisée et construire ce composant dans la classe d'application?

Si je crée un composant dans la classe d'application, cela signifie-t-il que toutes les instances d'objet disponibles via ce composant seront une instance singleton dans l'application jusqu'à ce que l'application soit supprimée ou redémarrée?

J'ai un composant avec une portée personnalisée, disons @ActivityScope, et je construis ce composant dans une activité, les instances d'objet injectées via ce composant seront-elles détruites automatiquement après l'appel de onDestroy () de cette activité?

Encore une fois, j'ai un composant avec une étendue personnalisée, disons @ActivityScope, et je construis ce composant dans ActivityA et ActivityB, ActivityA et ActivityB partageront-ils les mêmes instances d'objet de ce composant ou auront-ils leurs propres instances du même objet?

41
s-hunter

Comment je le comprends:

Et gardez à l'esprit deux choses (quand j'ai lu pour la première fois 1), cela m'a rendu tout plus propre):

1) Les composants vivent aussi longtemps que vous le souhaitez ou aussi longtemps que la classe qui a créé le composant n'a pas été détruite (comme Android activité ou fragment)

2) Si vous n'annotez pas, vous fournissez des méthodes avec annotation (doit être la même que l'annotation de composant) de nouveaux objets seront créés à chaque fois que vous en demanderez

Quel est le cycle de vie d'un composant intégré à la classe d'application?

Le composant construit dans la classe d'application vit aussi longtemps que vous le souhaitez. Je veux dire que vous pouvez le créer à tout moment et le supprimer à tout moment tant que vous le créez dans une classe qui étend Android Classe d'application (de cette façon, l'objet composant vivra aussi longtemps que votre Android L'application est en cours d'exécution) contrairement au composant qui est intégré dans la classe d'activité - elle vivra aussi longtemps que l'activité sera active, elle pourra donc être détruite par exemple lors d'un changement d'orientation. Gardez à l'esprit que si, pour une raison quelconque, vous n'avez pas créé votre composant ApplicationComponent dans la méthode onCreate () de la classe Application (par exemple, vous l'avez créé plus tard lorsque quelque chose s'est produit), il peut être détruit (annulé) lorsque Android OS la mémoire est insuffisante et l'utilisateur a fermé votre application, puis lorsque l'utilisateur revient à votre application (pour la dernière activité visible) lorsqu'elle a été supprimée plus tôt et que vous demandez à votre composant d'application de faire quelque chose, puis vérifiez s'il n'est pas nul

Quel est le cycle de vie d'un composant intégré à la classe Activity ou Fragment?

J'ai répondu partiellement dans la réponse ci-dessus. Si vous créez votre composant dans Fragment/Activity, il vit aussi longtemps que vous le souhaitez ou tant que l'activité ou le fragment n'est pas détruit en raison d'un changement d'orientation ou d'une mémoire insuffisante

Si je veux une instance singleton à partir d'un composant, dois-je annoter le composant avec @Singleton ou une étendue personnalisée et construire ce composant dans la classe d'application?

Cela dépend de l'endroit où vous souhaitez utiliser ce singleton. Si vous voulez un singleton dans une seule activité, vous pouvez créer par exemple l'annotation @ActivityScope et annoter des méthodes et ActivityComponent avec cette annotation, alors vous créez votre ActivityComponent dans la méthode d'activité onCreate () et vous avez un singleton aussi longtemps que votre activité dure (elle peut soyez utile si vous prévoyez de partager un singleton entre différents fragments d'une même activité). Si vous voulez singleton entre différentes activités/fragments dans l'application, la meilleure façon de le faire serait de le créer dans AppModule et d'annoter fournir la méthode et le composant d'application avec une annotation singleton.

Si je crée un composant dans la classe d'application, cela signifie-t-il que toutes les instances d'objet disponibles via ce composant seront une instance singleton dans l'application jusqu'à ce que l'application soit supprimée ou redémarrée?

Si vous annotez fournissez des méthodes avec l'annotation @Singleton, alors oui

J'ai un composant avec une portée personnalisée, disons @ActivityScope, et je construis ce composant dans une activité, les instances d'objet injectées via ce composant seront-elles détruites automatiquement après l'appel de onDestroy () de cette activité?

Oui

Encore une fois, j'ai un composant avec une étendue personnalisée, disons @ActivityScope, et je construis ce composant dans ActivityA et ActivityB, ActivityA et ActivityB partageront-ils les mêmes instances d'objet de ce composant ou auront-ils leurs propres instances du même objet?

Ils auront leurs propres instances

35
Adrian Kapuscinski