我已经阅读了很多关于匕首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
What determines the lifecycle of a component (object graph) in Dagger 2?
等
但我仍然对组件的生命周期以及它与模块和范围的关系感到困惑。我想确保在我只需要Singleton时不创建对象的多个实例。希望有人可以对这些有所了解:
在应用程序类中构建的组件的生命周期是什么?
Activity或Fragment类中构建的组件的生命周期是什么?
如果我想从组件中获取单例实例,是否必须使用@Singleton或自定义范围对组件进行批注,并在应用程序类中构建该组件?
如果我在应用程序类中构建一个组件,这是否意味着通过此组件可用的所有对象实例将是整个应用程序中的单例实例,直到应用程序被终止或重新启动?
我有一个带有自定义范围的组件,比方说@ActivityScope,我在Activity中构建该组件,在调用此活动的onDestroy()之后,是否会自动销毁通过此组件注入的对象实例?
我再次拥有一个带有自定义范围的组件,比如说@ActivityScope,我在ActivityA和ActivityB中构建了这个组件,ActivityA和ActivityB将从这个组件共享相同的对象实例,或者它们将拥有自己的同一个对象的实例?
答案 0 :(得分:30)
我的理解:
请记住两件事(当我第一次读到1时)它让我的一切变得更清洁了:
1)只要您想要它,或者只要创建组件的类没有被销毁(如android活动或片段)
2)如果您没有注释,则提供带注释的方法(必须与组件注释相同)每次请求时都会创建新对象
在应用程序类中构建的组件的生命周期是什么?
应用程序类中内置的组件可以随时使用。我的意思是你可以随时创建它并随时删除它,只要你在扩展android Application类的类中创建它(这样组件对象将在你的Android App运行时生存)与构建的组件形成对比在活动类中 - 只要活动处于活动状态,它就会存在,因此可能会在方向更改时被销毁。 请记住,如果由于某种原因,您没有在Application类的onCreate()方法中创建ApplicationComponent(例如,您在以后发生某些事情时创建了它),那么当Android OS内存和用户不足时,它可以被销毁(无效)关闭你的应用程序,然后当用户回到你的应用程序(到最后一次可见的活动)时,它已被杀死,你要求你的应用程序组件做某事,然后检查它是否为空
在Activity或者中构建的组件的生命周期是什么 片段类?
我在上面的回答中部分回答了这个问题。如果您在Fragment / Activity中创建组件,只要您想要或只要活动或片段不因方向更改或内存不足而被破坏
如果我想从组件中获取单例实例,我是否必须注释 具有@Singleton的组件或自定义范围并构建它 应用程序类中的组件?
这取决于你想要使用这个单身人士的地方。如果你想在单个活动中使用单例,你可以创建例如@ActivityScope注释和注释提供方法和带有这个注释的ActivityComponent,然后在onCreate()Activity方法中创建你的ActivityComponent,只要你的活动存在,你就有一个单例(它可能是如果您计划在同一活动的不同片段之间共享一个单例,请提供帮助。 如果你想在app中的不同的acctivities / fragment之间使用单例,最好的方法是在AppModule中创建它,并使用singleton注释提供方法和app组件。
如果我在应用程序类中构建组件,那是否意味着所有组件 通过此组件可用的对象实例将是a 整个应用程序中的单例实例,直到应用程序被杀或 重新启动?
如果注释使用@Singleton注释提供方法,则为是
我有一个带有自定义范围的组件,比方说@ActivityScope和我 在Activity中构建该组件,将对象实例 通过该组件注入后,将自动销毁 活动的onDestroy()被称为?
是
我再次拥有一个带有自定义范围的组件,比如@ActivityScope, 我在ActivityA和ActivityB中构建了这个组件,将ActivityA 和ActivityB从此组件或共享相同的对象实例 他们将有自己的同一个对象的实例?
他们将拥有自己的实例