viewModelScope.launch viewModel 变量 onDestory() 不工作

viewModelScope.launch with the viewModel variable onDestory() not working

以下 coe 只打印“onDestory”,不打印“launch”。但是,如果我像第二个块一样修改代码,则会打印“launch”。这是为什么? class成员变量在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");
    }
  }

我下面的回答是基于这样的假设,即您的 Activity 正在完成而不是被重新创建(例如,配置更改会发生这种情况)

viewModelScope 是一个特殊的作用域,它遵循 ViewModel 的生命周期。这意味着如果 viewModel.onCleared() 被调用,那么 viewModelScope 将被取消。旁注:如果您尝试在取消范围内启动协程,则不会发生任何事情。

现在看看 ViewModel Lifecycle 如果您的 activity 正在完成,那么 onCleared() 将在您的 Activity.

的 onDestroy 之后立即被调用

关于你的代码,我认为你试图开始的工作永远不会开始,因为你的 onCleared 在 Dispatchers.IO 设法开始工作之前被调用

第二个代码块(我在这里猜测)可能正在创建另一个 ViewModel 实例,它以某种方式设法比 activity 的破坏存活得更久,因为它没有收到 activity ] 生命周期调用(在 onDestroy 之后没有发生其他事情)。 这可能是一个错误。在我看来,你不应该被允许在 onDestroy

中向提供者请求视图模型