在方向改变时处理匕首组件

假设这里已经说过,开发人员有责任保留组件实例以实现自己的范围逻辑(因为范围方法将为给定组件返回相同的实例)。

通过活动生命周期保持此组件引用的干净方法是什么?

示例:您正在实施MVP模式,因此您需要在Activity中使用Presenter。 此演示者可以执行网络操作来下载项目。 当设备旋转时,您的Activity将被销毁并重新创建,但您希望保持网络运行,并且只需返回预旋转演示者。

为提供Presenter的组件定义一个自定义PerActivity范围是解决方案,因此您必须通过此循环保持Component实例,以便在首次启动Activity时注入相同的Presenter实例。

我们怎么处理这个? 我想到了一种组件缓存(如HashMap?),它可以由生活在Application类中的Application Component提供。

你可以看到ribot / android-boilerplate showcase app的实现。 他们选择的解决方案是在BaseActivity包含一个static Map ,所有活动都从中扩展。

 public class BaseActivity extends AppCompatActivity { private static final AtomicLong NEXT_ID = new AtomicLong(0); private static final Map sComponentsMap = new HashMap<>(); private ActivityComponent mActivityComponent; private long mActivityId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the ActivityComponent and reuses cached ConfigPersistentComponent if this is // being called after a configuration change. mActivityId = savedInstanceState != null ? savedInstanceState.getLong(KEY_ACTIVITY_ID) : NEXT_ID.getAndIncrement(); ConfigPersistentComponent configPersistentComponent; if (!sComponentsMap.containsKey(mActivityId)) { // Creating new component configPersistentComponent = DaggerConfigPersistentComponent.builder() .applicationComponent(BoilerplateApplication.get(this).getComponent()) .build(); sComponentsMap.put(mActivityId, configPersistentComponent); } else { // Reusing component configPersistentComponent = sComponentsMap.get(mActivityId); } mActivityComponent = configPersistentComponent.activityComponent(new ActivityModule(this)); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(KEY_ACTIVITY_ID, mActivityId); } @Override protected void onDestroy() { if (!isChangingConfigurations()) { // Activity is finishing, removing the component sComponentsMap.remove(mActivityId); } super.onDestroy(); } ... } 

网络可以使用应用程序上下文。 这就是我用appscope设计Applicationcomponent的方法现在我将在应用层上创建这个应用程序组件Shouod将上下文作为外部依赖

接下来是使用peractivityscope在activitymodule上扩展的activitycomponent。取决于applicationcomponet

在我的每个活动中,我将通过提供applicationcomponet来创建activityComponet。可以通过访问此应用程序组件。 Activity.getapplication()。getapplicationcomponent()

这里确保你的applicationmodule提供网络方法有appcope如果是这样的情况你应该得到相同的网络甚至在应用程序rorate。

查找GitHubapplication示例将在下次编辑中发布链接。

同样值得看看livingata(这个问题的上下文)