首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何@为MortarActivityScope提供一个活动,而不泄漏有关方向更改的活动?

如何@为MortarActivityScope提供一个活动,而不泄漏有关方向更改的活动?
EN

Stack Overflow用户
提问于 2014-10-23 17:14:20
回答 1查看 605关注 0票数 5

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

代码语言:javascript
复制
@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()方法中看到这一点:

代码语言:javascript
复制
@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并没有用新蓝图提供的新模块替换旧活动范围中的模块。相反,对象图保留对前一个模块的引用,包括已销毁的活动。

代码语言:javascript
复制
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对象等)的情况下,最好的方法是什么?改变方向?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-23 22:55:30

不要让任何人注射这种活动,这是不安全的。相反,注入一个与活动相关的演示程序。

How to handle onActivityResult() with Mortar包括一个拥有演示者的活动的示例。你的应用程序的其他部分,包括其他演示程序,然后可以注入其中一个,并要求它做任何他们需要做的,需要处理的活动。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26533621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档