viewModelScope.slaunch的viewModel变量onDestory()不起作用



下面的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之后没有发生其他事情(。这可能是一个错误。在我看来,你不应该被允许在销毁时向提供商请求视图模型

最新更新