Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何@为MortarActivityScope提供活动,而不泄漏方向更改时的活动?_Java_Android_Dagger_Mortar_Square Flow - Fatal编程技术网

Java 如何@为MortarActivityScope提供活动,而不泄漏方向更改时的活动?

Java 如何@为MortarActivityScope提供活动,而不泄漏方向更改时的活动?,java,android,dagger,mortar,square-flow,Java,Android,Dagger,Mortar,Square Flow,我有一个MortarActivityScope应用程序,它是根范围下的第一个子项。MortarActivityScope有一个ActivityScope,@为注入的类提供一个活动: @Module(addsTo = ApplicationModule.class, injects = {Foo.class, SomePresenter.class, AnotherPresenter.class}) public class ActivityModule { private final

我有一个MortarActivityScope应用程序,它是根范围下的第一个子项。MortarActivityScope有一个ActivityScope,@为注入的类提供一个活动:

@Module(addsTo = ApplicationModule.class, injects = {Foo.class, SomePresenter.class, AnotherPresenter.class})
public class ActivityModule {

    private final Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    @Provides Activity provideActivity() {
        return activity;
    }
}

public class Foo {
    private final Activity activity;
    @Inject(Activity activity) {
        this.activity = activity;
    }
    public void doSomethingWithActivity() {
       // do stuff with activity: findViewById(), getWindow(), mess with action bar etc.
    }
}
在方向发生变化之前,这是正常的。在砂浆样本项目中,活动范围不会因方向更改而被破坏。这大概是为了允许@Singleton演示者、屏幕等在方向更改中保持不变。您可以在示例项目的主要活动中的onDestroy()方法中看到这一点:

@Override protected void onDestroy() {
    super.onDestroy();

    actionBarOwner.dropView(this);

    // activityScope may be null in case isWrongInstance() returned true in onCreate()
    if (isFinishing() && activityScope != null) {
      MortarScope parentScope = Mortar.getScope(getApplication());
      parentScope.destroyChild(activityScope);
      activityScope = null;
    }
  }
}
但是,这样做意味着旧的ObjectGraph在方向更改中保持不变。我已经注意到,
Mortar.requireActivityScope
不会用新蓝图提供的新模块替换旧活动范围中的模块。相反,对象图保留对前一个模块的引用,包括已销毁的活动

public class MyActivity extends Activity implements Blueprint {

    @Inject foo;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MortarScope parentScope = Mortar.getScope(getApplication());
        activityScope = Mortar.requireActivityScope(parentScope, this);
        Mortar.inject(this, this);

        foo.doSomethingWithActivity(); //fails, because activity injected by object graph is destroyed
    }

    @Override
    public String getMortarScopeName() {
        return getClass().getName();
    }

    @Override
    public Object getDaggerModule() {
        return new ActivityModule(this);
    }
}

迫击炮示例活动似乎通过在主模块中不包含
@Provides activity
方法来解决这个问题。但是
MortarActivityScope
是否应该能够注入活动?要做到这一点,在方向更改时不丢失所有单例对象(
Presenter
对象等)的首选方法是什么?

不允许任何人插入活动,这是不安全的。而是注入一个绑定到活动的演示者

包括拥有演示者的活动的示例。然后,应用程序的其他部分,包括其他演示者,可以注入该部分,并要求它执行需要处理活动的任何操作


而且,没有必要将所有特定于活动的工作绑定到单个活动演示者中。我们的活动有几个演示者,他们将其服务代理到应用程序的其余部分。

非常优雅。使用注入的Presenter是我从未考虑过的路径,与手动更新包含活动引用的每个对象相比,它的簿记工作要少得多。