Dagger 2:是否建议为活动和片段使用静态提供程序?

时间:2017-09-27 07:45:55

标签: android dagger-2

我最近在Dagger 2上观看了a talk by Gregory Kick。在那里,他解释了静态提供程序方法,这可能有助于提高性能。所以我将项目中的所有提供者方法修改为static。但我在这里有一个疑问。在我的项目中,有一些提供程序返回活动实例(外部依赖项)。所以我写了module 使用构造函数,从外部获取Activity

@Module
public class ActivityModule {
  private static BaseActivity mActivity;

  public ActivityModule(BaseActivity activity) {
    mActivity = activity;
  }

  @ActivityScope
  @Provides
  Activity mActivity() {
    return mActivity;
  }

  @ActivityScope
  @Provides
  BaseActivity baseActivity() {
    return mActivity;
  }
}

所以,如果我必须使提供者静态,它将看起来如下

@Module
public class ActivityModule {
  private static BaseActivity mActivity;

  public ActivityModule(BaseActivity activity) {
    mActivity = activity;
  }

  @ActivityScoped
  @Provides
  static Activity mActivity() {
    return mActivity;
  }

  @ActivityScoped
  @Provides
  static BaseActivity baseActivity() {
    return mActivity;
  }
}

所以,我在这里将活动实例保留在static成员中。它会导致任何内存泄漏吗?或者,当活动被破坏时,匕首会通过删除静态引用来自动管理它吗? 在这种情况下,建议保留静态提供程序吗?

1 个答案:

答案 0 :(得分:3)

  

是否建议为活动和片段使用静态提供程序?

不。您所做的只是创建错误和内存泄漏的来源。根据经验,永远不要将任何Android Framework类型放入静态变量中。他们引用context并且你会泄漏记忆。

如前所述,静态方法可能会提升性能,当然您可以使用它。您显示的代码的问题是返回静态变量的静态方法 - 这也违背了调用模块构造函数的目的。

如果你的模块只包含静态方法,你可能会获得一些额外的性能,并且不需要模块实例分配,正如他们在链接的谈话中所提到的那样。

静态方法本身是可以的,但它们不应该与应用程序的其他部分交互,例如读取或写入静态变量。如果您对其他对象有依赖关系,请始终将它们作为参数添加到您的提供方法中。这样Dagger可以正确使用这些方法,你可能会获得一些性能。

  

如何从静态提供程序返回新的片段实例?

@Provides @ActivityScoped static MyFragment provideFragment() {
  return MyFragment.createInstance();
}

我相信这实际上可以。它是一个静态方法,它返回一个片段的新实例,不应包含任何副作用。

请确保每当重新创建活动时,您重新创建@ActivityScoped组件,并且片段保持其状态。你真的想避免FragmentManager管理一个与你组件中的片段不同的片段,或者更糟糕的是,两者都是。