我最近在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
成员中。它会导致任何内存泄漏吗?或者,当活动被破坏时,匕首会通过删除静态引用来自动管理它吗?
在这种情况下,建议保留静态提供程序吗?
答案 0 :(得分:3)
是否建议为活动和片段使用静态提供程序?
不。您所做的只是创建错误和内存泄漏的来源。根据经验,永远不要将任何Android Framework类型放入静态变量中。他们引用context
并且你会泄漏记忆。
如前所述,静态方法可能会提升性能,当然您可以使用它。您显示的代码的问题是返回静态变量的静态方法 - 这也违背了调用模块构造函数的目的。
如果你的模块只包含静态方法,你可能会获得一些额外的性能,并且不需要模块实例分配,正如他们在链接的谈话中所提到的那样。
静态方法本身是可以的,但它们不应该与应用程序的其他部分交互,例如读取或写入静态变量。如果您对其他对象有依赖关系,请始终将它们作为参数添加到您的提供方法中。这样Dagger可以正确使用这些方法,你可能会获得一些性能。
如何从静态提供程序返回新的片段实例?
@Provides @ActivityScoped static MyFragment provideFragment() { return MyFragment.createInstance(); }
我相信这实际上可以。它是一个静态方法,它返回一个片段的新实例,不应包含任何副作用。
请确保每当重新创建活动时,您重新创建@ActivityScoped
组件,并且片段不保持其状态。你真的想避免FragmentManager管理一个与你组件中的片段不同的片段,或者更糟糕的是,两者都是。