Dagger2 - DoubleCheck中的重复实例

时间:2017-11-03 16:05:01

标签: android kotlin dagger-2 dagger

我正在使用带有dagger-android-support的Dagger v2.12以及以下配置:

AppComponent

@Singleton
@Component(
        modules = arrayOf(
                AndroidSupportInjectionModule::class,
                AndroidBindingModule::class,
                AppModule::class
        )
)
interface AppComponent : AndroidInjector<App> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()
}

AndroidBindingModule

@Module
abstract class AndroidBindingModule {
    @PerActivity
    @ContributesAndroidInjector(modules = arrayOf(MainModule::class))
    internal abstract fun contributeMainActivityInjector(): MainActivity
}

MainModule

@Module
class MainModule {

    ...

    @Provides @PerActivity
    fun providePresenter(rxLifecycle: ReactiveLifecycle, view: MainView) =
            MainPresenter(rxLifecycle, view)

}

MainActivity

class MainActivity : BaseActivity() {
    @Inject
    lateinit var presenter: MainPresenter

    ...
}

分析内存转储,我注意到MainPresenter类已创建两次,一个在MainActivitydagger.internal.DoubleCheck中引用(如预期的那样)1,但是,还有一个仅在dagger.internal.DoubleCheck 2中引用的第二个实例。

sample1

sample2

为什么会这样?这是我的Dagger配置中的错误,预期行为或某些问题吗?

编辑: 问题存储库,问题为https://github.com/ismaeldivita/dagger-test-so

1 个答案:

答案 0 :(得分:3)

问题是,您在活动课程中执行了MATCH (n:Person)-[r]->(m) WHERE n.name = "John" 次2次。这种情况会发生,因为您的活动是AndroidInjection.inject(this)的后代,后者又会执行DaggerAppCompatActivity

来自AndroidInjection.inject(this)的{​​{3}}:

  

DaggerAppCompatActivity AppCompatActivity注入onCreate(Bundle)中的成员,可用于注入附加到其中的Fragments

AndroidInjection.inject(this)类中省略MainActivity行后,您将获得logcat中的预期输出:

docs