2017-08-10 29 views
0

据我所知,在对组件和模块进行作用域定位时,只要暴露它们的组件存在,就会提供(@)实例。Dagger2自定义作用域和销毁组件

更具体地说,对于@用户范围的组件,我们可以删除在用户注销时填充了用户特定数据的@提供的对象(由模块提供)。当一个新用户登录时,我们应该创建一个新的Dagger组件,这个组件将反过来暴露那些将用这个(新登录的)用户特定数据填充的对象。只要组件在注销时不被破坏,这些对象就会保持活动状态。

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

回答

1

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


匕首将注入或构建你的对象,但这些对象做什么完全取决于你。如果要将从UserComponent获取的User对象保存在静态变量中,则在组件被垃圾收集后显然仍然可用。

为了防止这样的问题,而不是利用静态变量,并注意当你将短生命的物体移交给更长寿的物体。

如果您有一些UserScoped对象,那么在Application中引用它不是一个好主意,除非在用户注销时删除引用以及您的组件。最简单的方法是获取有权访问用户作用域组件的每个片段,服务和活动,并清理保存该组件的Application/Singleton。

如果您没有将任何短寿命对象“泄漏”到寿命较长的对象,垃圾收集器将负责其余部分。

0

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

对于登录作用域组件,只要用户登录,就保留对组件的引用,以便在用户会话期间完成依赖关系注入。

如果依赖项只被注入一次,则不需要保持对组件的引用,例如组件属于特定的android活动。