在 Activity 和 Fragment 当中,lifecycleScope 的使用是必不可少的,viewmodel 中的 viewModelScope 也非常好用,它们都自带生命周期的管理
因为 Activity 和 Fragment 都实现了 LifecycleOwner 和 ViewModelStoreOwner
但是在 Dialog 的开发当中,默认是没有实现这两个接口的,所以默认不支持使用 lifecycleScope 以及自动管理 viewmodel 的生命周期。
那既然默认没有,那我们就可以自己加上相关的逻辑来实现自动管理生命周期:
abstract class BaseLifecycleDialog(private val context: Context) : Dialog(context), LifecycleOwner, ViewModelStoreOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
override val viewModelStore = ViewModelStore()
override val lifecycle = lifecycleRegistry
override fun show() {
super.show()
lifecycleRegistry.currentState = Lifecycle.State.RESUMED
}
override fun dismiss() {
super.dismiss()
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
viewModelStore.clear()
}
protected inline fun <reified VM : ViewModel> viewModels(): Lazy<VM> {
return ViewModelLazy(VM::class, { viewModelStore }, { ViewModelProvider.NewInstanceFactory() })
}
}
使用:
class MyDialog(private val context: Context): BaseLifecycleDialog(context) {
private val vm by viewModels<XXXVM>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
// xxxx
}
}
}
可以看到继承 BaseLifecycleDialog 之后就能使用 lifecycleScope 了,这里我还加了 by viewModels,并且会自动管理生命周期去进行资源的释放,这样在 dialog 中的开发就和 Activity/Fragment 中一样了。
一般情况下 Dialog 是与对应的 Activity 所绑定的,所以一般情况下 Dialog 的生命周期也是与 Activity 所绑定。但是在特定的业务场景中,是需要 Dialog 去自己管理生命周期的,这种情况就需要我们去自己封装一个支持生命周期相关方法的基类了