es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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");
    }
  }
Tags:  , ,

Answer

  1. Avatar for 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 que onDestroy() 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 variable viewModel 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 de onDestroy() 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.

Comments are closed.