下面的coe只打印"onDestory";,而不是";启动";。但是如果我像第二块一样修改代码;启动";已打印。为什么?类成员变量是否在onDestroy()
之前销毁?
lateinit var viewModel: ArticleViewModel;
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this)[ArticleViewModel::class.java];
....
override fun onDestroy()
{
super.onDestroy()
Log.d("stack", "onDestroy");
viewModel.viewModelScope.launch(Dispatchers.IO)
{
Log.d("stack", "launch");
}
}
修改
override fun onDestroy()
{
super.onDestroy()
Log.d("stack", "onDestroy");
val vm = ViewModelProvider(this)[ArticleViewModel::class.java];
vm.viewModelScope.launch(Dispatchers.IO)
{
Log.d("stack", "launch");
}
}
我下面的回答是基于这样一个假设,即您的"活动"正在完成,而没有被重新创建(例如,在配置更改中会发生这种情况(
viewModelScope是遵循ViewModel生命周期的一个特殊作用域。这意味着,如果调用了viewModel.onCleared((,则将取消viewModelScope。附带说明:如果您尝试在取消的范围内启动协同程序,则不会发生任何事情。
现在来看一下ViewModel生命周期如果您的活动正在完成,那么在活动的onDestroy之后不久就会调用onCleared((。
谈到你的代码,我认为你试图启动的作业永远不会启动,因为你的onCleared是在Dispatchers.IO设法启动作业之前调用的
第二个代码块(我在这里猜测(可能正在创建ViewModel的另一个实例,该实例在某种程度上能够在活动销毁后存活,因为它没有接收到活动生命周期调用(onDestroy之后没有发生其他事情(。这可能是一个错误。在我看来,你不应该被允许在销毁时向提供商请求视图模型