以下 coe 僅列印“onDestory”,而不是“launch”。但是,如果我像第二個塊一樣修改代碼,則會列印“啟動”。這是為什么?類成員變數之前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");
}
}
uj5u.com熱心網友回復:
我下面的回答是基于假設您的 Activity 正在完成并且沒有被重新創建(例如,這是在配置更改中會發生的情況)
viewModelScope 是一個特殊的作用域,它遵循 ViewModel 的生命周期。這意味著如果 viewModel.onCleared() 被呼叫,則 viewModelScope 將被取消。旁注:如果您嘗試在取消的范圍內啟動協程,則不會發生任何事情。
現在看一下ViewModel 生命周期 如果您的 Activity 正在完成,那么 onCleared() 將在您的 Activity 的 onDestroy 之后很快被呼叫。
談到您的代碼,我認為您嘗試開始的作業永遠不會開始,因為您的 onCleared 在 Dispatchers.IO 設法開始作業之前被呼叫
第二個代碼塊(我在這里猜測)可能正在創建 ViewModel 的另一個實體,該實體以某種方式設法使活動的銷毀時間更長,因為它沒有收到活動生命周期呼叫(在 onDestroy 之后沒有發生任何其他事情)。這可能是一個錯誤。在我看來,您不應該被允許在 onDestroy 內部向提供者請求視圖模型
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/401982.html
上一篇:springbootjparepository.save(obj)不能為null,NullPointerExceptionintest
