android - Dagger2 范围和 Activity 生命周期

标签 android mvp dagger-2

我有一个 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/

相关文章:

android - JobService 不需要 android.permission.BIND_JOB_SERVICE 权限

android - 无法在 Flutter 中使用 Firebase Auth 进行注册

android - 如何在 android 2.3 中获取屏幕的最大 x 和 y 值?

c# - Linq to Sql 设计和 MVP

web-applications - MVP - Presenter 应该使用 Session 吗?

asp.net - 如何集成 ASP .Net Model View Presenter (MVP) 模式和标记为 [WebMethod] 的静态页面方法?

dependency-injection - 依赖于具有不同范围的其他组件的组件(具有不同范围的组件层次结构)

c# - Xamarin Android 数据绑定(bind)与 MVVM Light

java - Dagger2 错误 : Kotlin: Unresolved reference: DaggerSOMETHINGComponent

android - Dagger2 注入(inject)一切?