我有一个Android活动,正在使用Dagger2将Presenter注入其中。我希望Presenter能够保持状态,即使发生配置更改也是如此。
例如,我将使用Presenter发起网络呼叫,如果用户在进行网络呼叫时旋转设备,我希望能够在设备完成旋转之后接收响应,并且不必重新启动呼叫。
我被绊倒了,因为如果我将Presenter实例的范围限定在Activity的生命范围内,那么当Activity在配置更改期间通过onDestroy()进行操作时,Presenter不会被垃圾回收吗?我的另一个想法是使用在应用程序生命周期内有效的范围。但是,如果这样做,我如何确保一旦Activity被永久销毁(不是由于配置更改,而是按下返回按钮之类的东西),就可以对Presenter进行垃圾收集?
有没有一种方法可以确保我的Presenter在活动的配置更改中不会丢失,并且在应用程序的生命周期内不会泄漏?
我强烈建议您不要尝试执行此方法。
您正在有效地尝试使用DI框架以支持Activity
特定的生命周期流程,尽管DI框架并非旨在像这样使用。
我最近回答了另一个类似的问题,其中OP尝试在different之间共享View-Model中的状态Activities
。尽管用例不完全相同,但一般模式是相同的-尝试将流控制职责委托给DI框架,这不是一个好主意。
在您的情况下(IMHO)最好的方法是在旋转之前存储当前状态,在旋转时重新初始化演示者,然后恢复其状态。
您在轮换期间存储状态的方式取决于您要尝试保留的内容:
如果您需要保留与UI相关的状态(选择,文本,元素的位置等),则可以使用常规onSaveInstanceState()
和onRestoreInstanceState()
回调
如果您需要保留一些与业务相关的状态(正在进行的网络请求,数据,数据修改等),则将此逻辑封装在业务类(例如SomeBusinessUseCaseManager
)中,并从Application
具有范围的广泛组件中注入该类。
您可以在此处找到Dagger范围的详细评论。
有关Android中DI的更多信息,请参见此处。