0

有该喷射器用于在模块中如下定义的在MainActivity由所述ApplicationComponent引用:跨越相同的活性生命周期的结果多点喷射在多个实例

@PerActivity 
@ContributesAndroidInjector(modules = MainActivityModule.class) 
abstract MainActivity mainActivityInjector(); 

和MainActivityModule由贡献者引用看起来像这样:

@Module 
public class MainActivityModule { 

    @Provides 
    @PerActivity 
    public MyActivityDependency myActivityDependency() { 
     return new MyActivityDependency(); 
    } 
} 

,并在MainActivity本身是:

@PerActivity范围应该在整个生命周期中保留Activity的依赖项实例。

这基本上意味着如果我多次执行注入(AndroidInjection.inject(this)),我有权获得相同的注入实例(至少这是目标)。

在这种情况下,为什么每次调用“.inject()”方法时都会注入MyDependency的不同实例?

回答

1

@PerActivity范围应该保留活动的依赖关系实例贯穿其整个生命周期。

它确实。它仅在单个组件中创建一个带注释的依赖关系。

AndroidInjection只是知道如何为您的Activity/Fragment构建组件的帮助器类。它不存储或坚持它。因此...

AndroidInjection.inject(this); 

将在每次调用时创建一个新组件,然后注入依赖关系。它不应该被称为多次,为什么你会呢?只要叫一次onCreate,一切都会正常工作。

如果您想要要注入两次,您可以注入Activities组件本身,然后再次使用组件注入。这样做,使用相同的组件,你应该每次都得到相同的对象。

@Inject 
DoubleInjectActivityComponent component; 

只需要像注入任何其他依赖项那样注入它。

+0

除了确保实例针对每个范围正确缓存之外,没有具体的原因多次调用它。事实上,在较老的匕首方法中,可以进行这种完整性检查(或自动化测试)来确保这一点。它还可以确保意外错误不会中断应用程序的行为。 – Mahorad

+1

@Mahorad我不明白你为什么要那样做,但我为你添加了一个替代方案来回答 –

+0

谢谢大卫,你能详细阐述一下如何定义DoubleInjectActivityComponent并将它粘贴到ApplicationComponent和/或其他DI结构? – Mahorad