能否通过Dagger将当前Activity的lifecycleScope注入非Activity类?
能否通过Dagger将当前Activity的lifecycleScope注入到非Activity类中?
可以实现,而且能让协程在Activity销毁时自动终止,无需手动调用cleanUp()方法。以下是优化后的实现方案:
1. 为Activity的lifecycleScope提供Dagger绑定
在Activity对应的Dagger模块中,提供与当前Activity生命周期绑定的LifecycleCoroutineScope实例:
@Module class ActivityModule { @Provides @ActivityScope fun provideActivityLifecycleScope(activity: AppCompatActivity): LifecycleCoroutineScope { return activity.lifecycleScope } }
@ActivityScope保证该scope实例与Activity的生命周期完全绑定,每个Activity实例都会获取到自己专属的lifecycleScope。
2. 修改Foo类的注入逻辑
直接注入LifecycleCoroutineScope即可,无需额外命名注解;同时可以移除cleanUp()方法,因为lifecycleScope会在Activity销毁时自动取消所有子协程:
@ActivityScope class Foo @Inject constructor( private val bar: Bar, private val activityScope: LifecycleCoroutineScope ) { init { activityScope.launch { bar.myFlow?.collect { // 处理结果 } } } }
3. 确保组件关联正确
确认你的DaggerAppCompatActivity对应的Dagger组件(如ActivityComponent)已包含ActivityModule,且组件的作用域为@ActivityScope。这样Dagger会自动将当前Activity实例与提供的lifecycleScope关联起来。
关键说明
- 无论运行时是
MyActivity还是其他继承自DaggerAppCompatActivity的Activity,只要遵循相同的Dagger配置,都会自动注入对应Activity的lifecycleScope。 - 所有通过该scope启动的协程,会在Activity执行
onDestroy()时自动被取消,完全无需手动管理协程的生命周期。
内容的提问来源于stack exchange,提问作者Chad Schultz
相关产品推荐
相关产品推荐

