Dagger 2如何处理不再需要的注入区域?

问题描述 投票:1回答:1

我有一个关于将多个片段注入活动字段的问题。目前我有这样的设置(所有片段扩展DaggerFragment,活动是DaggerAppCompatActivity):

@Inject
lateinit var fragmentOne: FragmentOne
@Inject
lateinit var fragmentTwo: FragmentTwo
@Inject
lateinit var fragmentThree: FragmentThree

override fun onCreate(...) {
    ...
    startFirstFragment()
}

fun startFirstFragment() {
    supportFragmentManager.beginTransaction()
            .replace(containerId, fragmentOne).commit()
}

fun startSecondFragment() {
    supportFragmentManager.beginTransaction()
            .replace(containerId, fragmentTwo).commit()
}

一切正常,直到我添加LeakCanary,它说,当我用第二个替换第一个片段时,被替换的实例通过lateinit var fragmentOne泄漏,因为它保留了对第一个片段的引用。我的问题是:什么时候匕首清空田地,它是否正确做到了谁应该责备:匕首导致泄漏,LeakCanary用于误报泄漏检测还是其他什么?

ApplicationComponent:

@ApplicationScoped
@Component(
        modules = [
            AndroidSupportInjectionModule::class,
            ActivityBindingModule::class,
            ApplicationModule::class,
            RepositoriesModule::class,
            NetworkModule::class]
)
interface ApplicationComponent : AndroidInjector<MyApp> {

    override fun inject(instance: MyApp?)

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder
        fun build(): ApplicationComponent
    }
}

ActivityBindingModule:

@Module
abstract class ActivityBindingModule {

    ...

    @ActivityScoped
    @ContributesAndroidInjector(modules = [ActivityInQuestionModule::class])
    internal abstract fun aiqActivity(): ActivityInQuestion

    @ActivityScoped
    @Binds
    internal abstract fun fragmentSwitcher(activityInQuestion: ActivityInquestion): FragmentSwitcher

}

ActivityInQuestionModule:

@Module
abstract class ActivityInQuestionModule {

    @FragmentScoped
    @ContributesAndroidInjector
    internal abstract fun fragmentOne(): FragmentOne

    @FragmentScoped
    @ContributesAndroidInjector
    internal abstract fun fragmentTwo(): FragmentTwo

    @FragmentScoped
    @ContributesAndroidInjector
    internal abstract fun fragmentThree(): FragmentThree

}
android kotlin dagger-2 leakcanary dagger
1个回答
0
投票

我很确定匕首不是泄漏的原因(如果存在的话)。匕首所做的只是用适当的实例来实例化活动成员。因此,您可以尝试运行LeakCarnary,代码修改如下:lateinit var fragmentOne = FragmentOne() ...并验证是否存在内存泄漏。也许问题出在你的片段代码中。

© www.soinside.com 2019 - 2024. All rights reserved.