android - Dagger 2 如何处理不再需要的注入(inject)字段?

标签 android kotlin dagger-2 leakcanary dagger

我有一个关于将多个 fragment 注入(inject) Activity 字段的问题。目前我有这样的设置(所有 fragment 都扩展 DaggerFragment 并且 Activity 是 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,它表示,当我用第二个 fragment 替换第一个 fragment 时,被替换的实例会通过 lateinit var fragmentOne 泄漏,因为它保留了对第一个 fragment 的引用分段。我的问题是:dagger 什么时候清空字段,它是否正确地清空字段,谁应该受到责备:dagger 导致泄漏,LeakCanary 用于误报泄漏检测还是其他什么?

应用组件:

@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
    }
}

Activity 绑定(bind)模块:

@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

}

最佳答案

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

关于android - Dagger 2 如何处理不再需要的注入(inject)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52091947/

相关文章:

android - 如何从浏览器 Activity 中获取 http 响应代码?

android - 如何使用 Enthought Canopy 编写安卓应用

android - R类中同一个资源生成不同的ID

android - 使用 Kotlin 函数特性如何使这段代码更好?

java - Dagger 2 : Cannot find symbol class when using subcomponent/dependent components

安卓 Kotlin : Error Unresolved reference: DaggerAppComponent

java - android中的权限

kotlin - 自引用对象中是否存在java.lang.ExceptionInInitializerError?

android - Kotlin 委托(delegate)内存使用

Android MVP + Google Dagger 2 + SQLite