Подтвердить что ты не робот

Жизненный цикл кинжала 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

Что определяет жизненный цикл компонента (графа объектов) в кинжале 2?

и др.

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

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

Каков жизненный цикл компонента, который был создан в классе Activity или Fragment?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

Если вы комментируете предоставление методов с помощью аннотации @Singleton, тогда да

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

Да

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

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