Ale*_*der 5 android dagger dagger-2 android-mvp
我是 Dagger2 依赖注入的新手。当屏幕旋转时,我很难保留相同的组件。
@Inject
MainActivityPresenterImpl presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
component = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.applicationComponent(TrainningDagger3.get(this).getComponent())
.build();
component.inject(this);
presenter.fetchData();
}
Run Code Online (Sandbox Code Playgroud)
我尝试调试应用程序,我认为当加载新配置时,它会创建组件的新实例和演示者的新实例。当屏幕旋转时,如何保留相同的组件和演示者。太感谢了!
您必须决定是否希望在屏幕旋转时销毁并重新创建您的 Activity(即“配置更改”)。如果您想自己处理(我建议您这样做),您只需在 AndroidManifest.xml 中进行更改即可;如果您想通过 Dagger 处理它,则需要将数据保存在寿命较长的对象中(例如您的 ApplicationComponent)。
正如在“处理配置更改”的官方文档中一样,您可以指示您的 Activity 仅处理方法调用而不是重新启动:
Run Code Online (Sandbox Code Playgroud)<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">现在,当这些配置之一发生更改时,
MyActivity不会重新启动。相反, 会MyActivity收到对 的呼叫onConfigurationChanged()。此方法会传递一个Configuration指定新设备配置的对象。通过阅读 中的字段Configuration,您可以确定新配置并通过更新界面中使用的资源来进行适当的更改。
重要的是,这使您可以使 ActivityComponent 与 Activity 本身一样长期存在,并且可以更好地推断 Activity 实例何时有效或过时。您仍然需要为 Android 的多任务处理加载和保存数据,但无论您如何使用 Dagger,这都是事实。
如果您认为在配置更改时销毁并重新创建 Activity 很重要,那很好,但如果您要创建或修改组件以使其寿命比单个 Activity 实例更长,我会警告您不要使用术语“活动组件” 。这将是该术语的非典型用法,并且可能会让其他开发人员感到非常困惑。相反,如果您希望 Dagger 组件为多个 Activity 实例(多个 Activity 类或同一 Activity 的多个实例)创建并保存状态,则应考虑将这些对象放入现有的 ApplicationComponent 中,或创建一个新组件(例如“SessionComponent”)的生命周期比 ActivityComponent 长,但比您的 ApplicationComponent 短。如果这样做,您需要非常小心,不要让该对象中的任何内容保留 Activity 实例、View 或与单个 Activity 永久关联的任何内容:这会导致内存泄漏,因为 Android 将无法当您的 SessionComponent 或 ApplicationComponent 持有对 Activity 的引用时,对 Activity 的这些部分进行垃圾收集。
| 归档时间: |
|
| 查看次数: |
1761 次 |
| 最近记录: |