android - Dagger2 自定义范围和销毁组件

标签 android dagger-2

据我了解,在确定组件和模块的范围时,(@)提供的实例将存在,只要暴露它们的组件存在。

更具体地说,在@User 范围组件的情况下,我们可以在用户注销时删除由用户特定数据填充的@provided 对象(由模块提供)。当新用户登录时,我们应该创建一个新的 Dagger 组件,该组件依次公开将使用该(新登录的)用户特定数据填充的对象。只要组件在注销时没有被破坏,这些对象将依次保持 Activity 状态。

我的问题很简单,我们如何在注销时销毁(子)组件?
我们只是将组件设置为 null 以便它可以被垃圾收集,并通过构建器手动创建一个新组件就足够了吗?

最佳答案

你必须自己清理。销毁组件不会破坏其作用域对象,如果您对作用域对象的引用比组件生命周期更长,则通常是内存泄漏的良好来源。

Dagger 将注入(inject)或构造您的对象,但您如何处理这些对象完全取决于您。如果您要保存 User从您的 UserComponent 获得的对象在静态变量中,在组件被垃圾收集后,它显然仍然可用。

为防止出现此类问题,最好不要使用静态变量,并在将短生命周期对象交给生命周期较长的对象时要小心。

如果您有一些 UserScoped 对象,那么在您的 Application 中引用它不是一个好主意。 ,除非您在用户注销时将引用连同您的组件一起删除。最简单的方法是重新接收有权访问用户范围组件的每个 fragment 、服务和 Activity ,并清理包含该组件的应用程序/单例。

如果您不将任何生命周期较短的对象“泄漏”给生命周期较长的对象,则垃圾收集器将处理其余部分。

关于android - Dagger2 自定义范围和销毁组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615085/

相关文章:

android - AWS Android SDK 示例中的 "the provided key element does not match the schema"

java - 用 lambdaj 映射两个 ArrayList?

android - Dagger 不为/测试类生成组件

android - 如何使用 Dagger2 将 ViewModel 注入(inject) BottomSheetDialogFragment?

java - Dagger2 模块 : how to obtain context to pass to the constructor of a class I want to provide

java - 无法在 API 23 及更低版本上下载 PDF 文件

android - 如何在没有按钮的情况下关闭 AlertDialog.Builder

Android 默认音调选择器问题(带有通知和警报的默认音调)

kotlin - 如何使用 Dagger 2 在 Kotlin 中注入(inject)命名字段参数?

java - 如何使用 Dagger2 将依赖项注入(inject)任何类型的对象?