Dagger 2 创建的对象在 Android 中保留多长时间/Dagger 2 如何玩转 Android Activity 生命周期?
How long do objects created by Dagger 2 remain in Android / how does Dagger 2 play with the Android Activity lifecycle?
假设我们有一个 @Singleton
应用程序模块,用于创建和 returns 一个 Hashmap
用于存储配置数据。如果在 hashmap 中修改了配置数据并且 android 应用程序进入后台,并且调用了 onPause() 和 onStop()。
- dagger创建的hashmap会被销毁吗?
- 如果应用程序回到前台,添加到 hashmap 的现有配置数据是否仍然存在?
How does Dagger 2 play with the Android Activity lifecycle?
不会。但你可以。
Dagger 只创造 Pojos。了解依赖项并在您需要时将它们提供给您的 Pojos。仅此而已。
如何使用这些对象(组件)完全取决于您。
正如大多数示例所示,通常有一个 AppComponent
,保存在 Application
中,每个 Activity
都有某种 ActivtiyComponent
。
AppComponent
保留在应用程序中,以共享其生命周期——如果应用程序被终止或重新创建,那么组件也是如此,您的对象也是如此。
ActivityComponent
已创建并保存在活动中。再一次,如果 activity 被重新创建,那么组件也会重新创建。它只不过是一个分配给 activity.
中字段的对象
那么为什么应用程序和 activity 组件之间存在差异?
应用程序组件将仅引用应用程序上下文,并提供 类 无需进一步信息即可提供。
activity 组件还将包含有关 activity 的信息。它可以访问视图、片段处理程序等等:Activity 东西!您为每个 activity 创建一个新组件,因为如果您不使用匕首,您也会使用当前的 activity 而不是在任何地方引用(和泄漏!)同一个组件。
回答你的问题
如果现在还不清楚,如果您在 AppComponent
(和 @Scope
中创建您的 HashMap
!),它将是相同的 HashMap
在你的整个应用程序中,如果你正确使用你的AppComponent
。一旦应用程序与您的 Application
实例一起终止,它将被销毁。
如果您在 ActivityComponent
中创建它,它将具有与 activity 对象相同的生命周期。如果 savedInstanceState
包含您的数据,您可能需要重新初始化 onCreate
中的内容。
综上所述,不要使用静态变量。如果将组件分配给静态变量,它们将破坏设置并导致内存泄漏。
如果您在 onCreate
中创建组件,则无需任何其他设置即可。只是不要使用静态变量来保存组件,而是确保它分别位于您的 activity 或应用程序中。
假设我们有一个 @Singleton
应用程序模块,用于创建和 returns 一个 Hashmap
用于存储配置数据。如果在 hashmap 中修改了配置数据并且 android 应用程序进入后台,并且调用了 onPause() 和 onStop()。
- dagger创建的hashmap会被销毁吗?
- 如果应用程序回到前台,添加到 hashmap 的现有配置数据是否仍然存在?
How does Dagger 2 play with the Android Activity lifecycle?
不会。但你可以。
Dagger 只创造 Pojos。了解依赖项并在您需要时将它们提供给您的 Pojos。仅此而已。
如何使用这些对象(组件)完全取决于您。
正如大多数示例所示,通常有一个 AppComponent
,保存在 Application
中,每个 Activity
都有某种 ActivtiyComponent
。
AppComponent
保留在应用程序中,以共享其生命周期——如果应用程序被终止或重新创建,那么组件也是如此,您的对象也是如此。
ActivityComponent
已创建并保存在活动中。再一次,如果 activity 被重新创建,那么组件也会重新创建。它只不过是一个分配给 activity.
那么为什么应用程序和 activity 组件之间存在差异?
应用程序组件将仅引用应用程序上下文,并提供 类 无需进一步信息即可提供。
activity 组件还将包含有关 activity 的信息。它可以访问视图、片段处理程序等等:Activity 东西!您为每个 activity 创建一个新组件,因为如果您不使用匕首,您也会使用当前的 activity 而不是在任何地方引用(和泄漏!)同一个组件。
回答你的问题
如果现在还不清楚,如果您在 AppComponent
(和 @Scope
中创建您的 HashMap
!),它将是相同的 HashMap
在你的整个应用程序中,如果你正确使用你的AppComponent
。一旦应用程序与您的 Application
实例一起终止,它将被销毁。
如果您在 ActivityComponent
中创建它,它将具有与 activity 对象相同的生命周期。如果 savedInstanceState
包含您的数据,您可能需要重新初始化 onCreate
中的内容。
综上所述,不要使用静态变量。如果将组件分配给静态变量,它们将破坏设置并导致内存泄漏。
如果您在 onCreate
中创建组件,则无需任何其他设置即可。只是不要使用静态变量来保存组件,而是确保它分别位于您的 activity 或应用程序中。