gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:26:10 26 4
gpt4 key购买 nike

我有一个关于将多个 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/

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