gpt4 book ai didi

android - Dagger2 - DoubleCheck 中的重复实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:40:53 24 4
gpt4 key购买 nike

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

应用组件

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

Android绑定(bind)模块

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

主模块

@Module
class MainModule {

...

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

}

主 Activity

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 的示例存储库

最佳答案

问题是,您在 Activity 类中执行了 2 次 AndroidInjection.inject(this)。发生这种情况是因为您的 Activity 是 DaggerAppCompatActivity 的后代,而后者又执行 AndroidInjection.inject(this)

来自docs DaggerAppCompatActivity:

An AppCompatActivity that injects its members in onCreate(Bundle) and can be used to inject Fragments attached to it.

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

enter image description here

关于android - Dagger2 - DoubleCheck 中的重复实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47099978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com