Dagger2 自定义范围和销毁组件

Dagger2 custom scopes and destroy component

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

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

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

只要存在对组件的引用,属于该组件的对象图就存在于内存中。

对于登录范围的组件,只要用户登录,就保留对该组件的引用,以便可以在用户会话期间完成依赖注入。

如果只注入一次依赖项,则不需要保留对组件的引用,例如属于特定 android activity.

的组件

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


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

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

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

如果您不 "leak" 任何较短寿命的对象到较长寿命的对象,垃圾收集器将处理其余的。