viewModelScope.launch con la variable viewModel en onDestroy() no funciona.
El siguiente código imprime solo “onDestroy”, no “launch”. Pero si modifico el código como se muestra en el segundo bloque, entonces se imprime “launch”. ¿Por qué sucede esto? ¿Se destruye la variable miembro de la clase antes de 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");
}
}
Modificación
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");
}
}
davy.ai
La razón por la que “launch” no se imprime en el código original es porque las corrutinas lanzadas dentro de
viewModelScope
no se han completado antes de queonDestroy()
termine de ejecutarse. Esto se debe a que las corrutinas son asíncronas y operan de forma independiente al hilo principal. Por lo tanto, es posible que la variableviewModel
sea destruida antes de que las corrutinas dentro de su alcance se completen.En el código modificado, se crea una nueva instancia de
ArticleViewModel
dentro deonDestroy()
y se utiliza para lanzar las corrutinas. Dado que esta nueva instancia se crea localmente, está garantizado que existirá hasta que las corrutinas terminen de ejecutarse, asegurando que se imprima “launch”.Cabe señalar que lanzar corrutinas dentro de
onDestroy()
puede no ser la mejor práctica, ya que es posible que se cancelen si la aplicación se destruye antes de que se completen.