Dagger 2 жизненный цикл компонента, модуля и области

Я прочитал много сообщений и учебников о dagger 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?

etc.

но я все еще смущен жизненным циклом компонента и тем, как он относится к модулю и области. Я хочу убедиться, что не создаю несколько экземпляров объекта, когда мне нужен только один элемент. Надеюсь, кто-то может пролить свет на это:

что жизненный цикл компонента, встроенного в класс приложения?

каков жизненный цикл компонента, встроенного в действие или класс фрагментов?

Если мне нужен одноэлементный экземпляр из компонента, я должен аннотировать компонент с помощью @Singleton или пользовательской области и построить этот компонент в классе приложения?

Если я создаю компонент в классе приложения, означает ли это, что все экземпляры объектов, доступные через этот компонент, будут одноэлементным экземпляром во всем приложении, пока приложение не будет убито или перезапущено?

У меня есть компонент с пользовательской областью скажем, @ActivityScope, и я создаю этот компонент в Activity, будут ли экземпляры объекта, введенные через этот компонент, автоматически уничтожаться после вызова onDestroy() этого действия?

снова у меня есть компонент с настраиваемой областью скажем @ActivityScope, и я построю этот компонент в ActivityA и ActivityB, будет ActivityA и ActivityB разделяют те же экземпляры объектов из этого компонента или они будут иметь свои собственные экземпляры одного и того же объекта?

1 ответов


Как я понимаю:

и имейте в виду две вещи (когда я впервые прочитал 1) он сделал все чище для меня):

1)Компоненты живут до тех пор, пока вы этого хотите или пока класс, который создал компонент, не был уничтожен (например, Android activity или fragment)

2) Если вы не аннотируете, вы предоставляете методы с аннотацией (должны быть такими же, как аннотации компонентов), новые объекты будут создаваться каждый раз, когда вы запрашиваете их!--6-->

что жизненный цикл компонента, встроенного в класс приложения?

компонент класса живет так долго, как вы хотите. Я имею в виду, что вы можете создать его в любое время и удалить его в любое время, пока вы создаете его в классе, который расширяет класс приложения android (таким образом, объект компонента будет жить до тех пор, пока ваше приложение Android работает) в отличие от компонента, встроенного в класс активности - он будет жить как пока активность жива, она может быть уничтожена, например, при изменении ориентации. Имейте в виду, что если по каким-то причинам вам не создать ваш ApplicationComponent в onCreate() метод класса приложения (например вы создали это позже, когда что-то случилось) оно может быть уничтожено (обнуляется), когда ОС Android не хватает памяти и пользователь закрыл приложение, а затем, когда пользователь возвращается к приложению (к последней видимой активности), когда он был убит раньше, и вы спрашиваете, ваше приложение компонента что-то проверить, если это не null

каков жизненный цикл компонента, встроенного в действие или Фрагмент класса?

Я частично ответил на него в ответ. Если вы создаете свой компонент внутри фрагмента / активности, он живет столько, сколько вы хотите, или пока активность или фрагмент не уничтожены из-за изменения ориентации или низкой памяти

Если я хочу одноэлементный экземпляр из компонента, я должен аннотировать этот компонент с @Singleton или пользовательской областью и построить, что компонент в классе приложения?

Это зависит от того, куда вы хотите использовать этот синглтон. Если вы хотите синглтон в одном действии, вы можете создать, например, аннотацию @ActivityScope и аннотировать методы и ActivityComponent с этой аннотацией, затем вы создаете свой ActivityComponent внутри метода действия onCreate (), и у вас есть синглтон до тех пор, пока ваша деятельность живет (это может быть полезно, если вы планируете иметь общий синглтон между различными фрагментами из одного и того же действия). Если вы хотите синглтон между различными acctivities / fragment в приложении, лучший способ сделать это-создать его в AppModule и аннотировать предоставить метод и компонент приложения с одноэлементной аннотацией.

Если я создаю компонент в классе приложения, это значит, что все экземпляры объектов, доступные через этот компонент, будут экземпляр singleton во всем приложении до приложение убито или перезапустить?

Если вы аннотируете методы с аннотацией @Singleton, то да

У меня есть компонент с пользовательской областью, скажем @ActivityScope, и я создайте этот компонент в действии, будут ли экземпляры объекта впрыснутый через этот компонент быть разрушенным автоматически после этого деятельности onDestroy() называется?

да

снова у меня есть компонент с таможней сфера скажем @ActivityScope, и я строю этот компонент в ActivityA и ActivityB, будет ActivityA и ActivityB используют одни и те же экземпляры объектов из этого компонента или у них будут свои экземпляры одного и того же объекта?

У них будут свои экземпляры