栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有MVP的Dagger 2,避免在视图重新创建时创建额外的演示者对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有MVP的Dagger 2,避免在视图重新创建时创建额外的演示者对象

首先,我只想提及一下,如果您注入演示者,则以后不应再从加载程序中对其进行分配。

可以使用注入来提供对象,也可以自己提供。如果两者都做,则很容易引入错误。


有没有一种方法可以在首次创建演示者时(在创建Loader之前)但在视图重新创建时避免它?

tl; dr
您需要为演示者提供一个范围,该范围反映了可能在配置更改后仍然存在的组件的生存期。此范围不得保留对Activity的任何引用

Context

组件遵循某些生命周期。通常

@Singleton
,您会保留一些带注释的组件,
Application
并在
@PerActivity
每个组件中创建一些或类似作用域的组件,
Activity
当活动进行配置更改时,这些组件将(并且应该)重新创建,因为这些依赖项通常引用Activity上下文,并且应该存在并且死于活动。

您在这里面临的主要问题是范围界定问题。

如果您的演示者没有作用域,则您每次请求一个演示者时都会重新创建一个演示者,一旦将其注入其他地方,就会无意中导致错误。通常,演讲者会被保留在活动中,并且通常会受到一定

@PerActivity
范围的限制。


如果您的演示者是

@PerActivity
作用域的一部分,则它(与所有其他
@PerActivity
依赖项一样)应该与所有其他依赖项一起重新创建。如果保留演示者,但重新创建所有其他对象,则旧的演示者仍将引用旧的依赖项,从而导致内存泄漏。
范围对象应该只存在于它们自己的范围内。

同一作用域中的对象可以互相引用,因此使一个作用域对象在其作用域之外仍然有效,也会无意中导致错误,内存泄漏等。

因此,您也不想 将此 演示者保留在Loader中。


另一方面,如果您说“
_否”,那么演示者在层次结构中要高出一步,该层次结构是

@PerScreen
,其中我保留了更长的活动对象,_那么您需要找到一种方法来使该
@PerScreen
组件保持活动状态,同时
@PerActivity
重新创建您的组件。活动。

假定以下作用域层次结构:

`X > Y` read X is subcomponent of Y@Singleton > @PerScreen > @PerActivity@Singleton: Application wide@PerScreen: Multiple activty lifecycles, keep alive during config changes@PerActivity: Maybe Context dependent, recreate with every activity

当配置发生更改时,您现在可以丢弃所有

@PerActivity
对象并重新创建它们,同时保留对您对象的引用
@PerScreen

你可能会注意到我怎么一直在谈论 保持

@PerScreen
部件 保持主持人,那就是这里的重要组成部分:

@PerScreen
作用域组件上,调用

myPerScreenComponent.getMyPresenter()

将始终返回 相同

@PerScreen
范围的演示者。

现在,如果您的

@PerActivty
作用域组件是的子组件
MyPerScreenComponent
,那么注入您的活动将始终为您提供相同的
@PerScreen
作用域演示者,这将在方向改变后仍然有效。

为了防止内存泄漏,您

@PerScreen
范围内的任何对象都不能引用该活动,并且演示者仅应保留
WeakReference
其视图(否则,请务必确保将视图设置为
null
“销毁”)。

这就是作用域的用途,这就是 避免在视图娱乐上创建额外的presenter对象的方式

因此,与其将演示者保留在加载器中,不如将组件保留在加载器中,以避免不必要的对象重现。


由于您现在每个活动有2个作用域和更多的回调,所有这些都可能会带来更多的复杂性。

我还看到了其他方法,可以在您的应用程序中将演示者保留为单例,但这会带来相同的问题,您必须确保不保留对Activity的任何引用。

就个人而言,我只是重新创建演示者并恢复状态,但是如果您选择采用自己的方法,则应确保您对范围和依赖项有深入的了解。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574200.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号