Android 跨同一活动生命周期的多次注入会导致多个实例

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

在ApplicationComponent引用的模块中有以下定义的Main活动的喷油器:

@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注入创建一个子组件,并将该子组件链接到其模块。