我有一个 Android Activity ,我正在使用 Dagger2 将 Presenter 注入(inject)其中。我希望我的 Presenter 能够保持状态,即使发生配置更改也是如此。
例如,我将使用 Presenter 启动网络调用,如果用户在网络调用进行中旋转设备,我希望能够在设备完成后收到响应它的轮换而不必重新启动调用。
我被绊倒了,因为如果我将 Presenter 实例的范围限定为 Activity 的生命周期,那么当 Activity 在配置更改期间通过 onDestroy() 时,Presenter 是否有可能被垃圾回收?我的另一个想法是使用在应用程序生命周期内有效的范围。但是,如果我这样做,我如何确保一旦 Activity 被永久销毁(不是由于 config.change,而是像按下后退按钮之类的东西),我的 Presenter 可以被垃圾回收?
有没有办法确保我的 Presenter 在 Activity 的配置更改后仍然存在,并且在应用程序的生命周期内也不会被泄露?
最佳答案
我强烈建议不要尝试实现这种方法。
您正在有效地尝试使用 DI 框架来支持 Activity
特定的生命周期流,尽管 DI 框架不打算像这样使用。
我最近回答了another similar question其中 OP 试图在不同的 Activities
之间共享 View-Model 中的状态。尽管用例不尽相同,但总体模式是相同的 - 尝试将流程控制职责委托(delegate)给 DI 框架,这不是一个好主意。
在您的情况下(恕我直言)最好的方法是在旋转之前存储当前状态,在旋转时重新实例化演示者,然后恢复其状态。
在旋转期间如何存储状态取决于您要保留的内容:
- 如果您需要保留 UI 相关状态(选择、文本、元素位置等),那么您可以使用通常的
onSaveInstanceState()
和onRestoreInstanceState()
回调 - 如果您需要保留一些与业务相关的状态(正在进行的网络请求、数据、数据修改等),则将此逻辑封装在业务类中(例如
SomeBusinessUseCaseManager
)并从中注入(inject)此类code>Application
范围内的组件。
您可以找到 Dagger 范围的详细评论 here .
有关 Android 中 DI 的更多信息,请参见 here .
关于android - Dagger2 范围和 Activity 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41842493/