Android 跨同一活动生命周期的多次注入会导致多个实例
在ApplicationComponent引用的模块中有以下定义的Main活动的喷油器:Android 跨同一活动生命周期的多次注入会导致多个实例,android,dependency-injection,scope,dagger-2,activity-lifecycle,Android,Dependency Injection,Scope,Dagger 2,Activity Lifecycle,在ApplicationComponent引用的模块中有以下定义的Main活动的喷油器: @PerActivity @ContributesAndroidInjector(modules = MainActivityModule.class) abstract MainActivity mainActivityInjector(); 参与者引用的MainActivityModule如下所示: @Module public class MainActivityModule { @Pro
@PerActivity
@ContributesAndroidInjector(modules = MainActivityModule.class)
abstract MainActivity mainActivityInjector();
参与者引用的MainActivityModule如下所示:
@Module
public class MainActivityModule {
@Provides
@PerActivity
public MyActivityDependency myActivityDependency() {
return new MyActivityDependency();
}
}
主要活动本身是:
public class MainActivity extends AppCompatActivity {
@Inject
MyActivityDependency myActivityDependency;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
Log.d(myActivityDependency.hashCode());
AndroidInjection.inject(this);
Log.d(myActivityDependency.hashCode());
...
}
@PerActivity作用域应该在活动的整个生命周期中保留活动的依赖实例
这基本上意味着,如果我多次执行注入(AndroidInjection.injection(This)),我有权获得相同的注入实例(至少这是目标)
在这种情况下,为什么每次调用“.inject()”方法时都会注入MyDependency的不同实例
@PerActivity作用域应该在活动的整个生命周期中保留活动的依赖实例
确实如此。它只在单个组件中创建一个带注释的依赖项一次
AndroidInjection
只是一个助手类,它知道如何为活动/片段构建组件。它不会存储或持久化它。因此
AndroidInjection.inject(this);
将在每次调用时创建一个新组件,然后注入依赖项。它不应该被多次调用,你为什么要这么做呢?只要在onCreate
中调用它一次,一切都会正常工作
如果要注入两次,可以注入Activities组件本身,然后使用该组件再次注入。这样做,使用相同的组件,每次都应该得到相同的对象
@Inject
DoubleInjectActivityComponent component;
只需像注入任何其他依赖项一样注入它
@PerActivity作用域应该在活动的整个生命周期中保留活动的依赖实例
确实如此。它只在单个组件中创建一个带注释的依赖项一次
AndroidInjection
只是一个助手类,它知道如何为活动/片段构建组件。它不会存储或持久化它。因此
AndroidInjection.inject(this);
将在每次调用时创建一个新组件,然后注入依赖项。它不应该被多次调用,你为什么要这么做呢?只要在onCreate
中调用它一次,一切都会正常工作
如果要注入两次,可以注入Activities组件本身,然后使用该组件再次注入。这样做,使用相同的组件,每次都应该得到相同的对象
@Inject
DoubleInjectActivityComponent component;
只需像注入任何其他依赖项一样注入它。除了确保为每个作用域正确缓存实例之外,没有任何特定的理由多次调用它。事实上,在旧的匕首方法中,人们可以做这样的健全性检查(或自动测试)来确保这一点。它还将确保意外错误不会破坏应用程序的行为。@Mahorad我不明白你为什么会这样做,但我为你添加了一个替代答案谢谢David,您能否详细介绍一下如何定义DoubleInjectActivityComponent并将其粘附到ApplicationComponent和/或DI结构的其余部分?@Mahorad这只是一个示例名称。无论您的组件有什么名称来执行注入,您都可以只注入该组件本身。当您使用
@ContributesAndroidInjector
时,我不知道该组件的名称,但我相信您可以找到,或者直接切换到具有子组件变体的模块并自己命名。我知道名称是任意的;相反,我想知道这样一个组件将如何与@ContributesAndroidInjector一起工作,后者本身为MainActivity注入创建一个子组件,并将该子组件链接到其模块。除了确保为每个作用域正确缓存实例外,没有任何特定的理由多次调用它。事实上,在旧的匕首方法中,人们可以做这样的健全性检查(或自动测试)来确保这一点。它还将确保意外错误不会破坏应用程序的行为。@Mahorad我不明白你为什么会这样做,但我为你添加了一个替代答案谢谢David,您能否详细介绍一下如何定义DoubleInjectActivityComponent并将其粘附到ApplicationComponent和/或DI结构的其余部分?@Mahorad这只是一个示例名称。无论您的组件有什么名称来执行注入,您都可以只注入该组件本身。当您使用@ContributesAndroidInjector
时,我不知道该组件的名称,但我相信您可以找到,或者直接切换到具有子组件变体的模块并自己命名。我知道名称是任意的;相反,我想知道这样一个组件将如何与@ContributesAndroidInjector一起工作,后者本身为MainActivity注入创建一个子组件,并将该子组件链接到其模块。