首先,我只想提及一下,如果您注入演示者,则以后不应再从加载程序中对其进行分配。
可以使用注入来提供对象,也可以自己提供。如果两者都做,则很容易引入错误。
有没有一种方法可以在首次创建演示者时(在创建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的任何引用。
就个人而言,我只是重新创建演示者并恢复状态,但是如果您选择采用自己的方法,则应确保您对范围和依赖项有深入的了解。



