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
中向提供者请求视图模型
以下 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
中向提供者请求视图模型