Saltar al contenido

LiveDataScope vs ViewModelScope en Android

Por fin luego de mucho trabajar ya dimos con la contestación de este apuro que muchos de nuestros lectores de esta web presentan. Si tienes algún detalle que aportar no dudes en dejar tu conocimiento.

Solución:

Nota: Esta podría ser una respuesta tardía para este tema si Autor de OP ya tiene comprensión sobre esto, pero brinda algunos consejos para el comentario de referencia de @IgorGanapolsky.


Veamos cuál es la principal diferencia entre viewModelScope Y LiveDataScope

1. viewModelScope:

El doctor oficial dice que, CoroutineScope atado a esto ViewModel. Este alcance se cancelará cuando ViewModel será borrado, es decir
ViewModel.onCleared se llama

Significa que El alcance de la corrutina está vinculado a ViewModel, y una vez que se borra ViewModel, este alcance se destruye cancelando todos los trabajos secundarios de rutina.

Básicamente, en el patrón MVVM usamos ViewModel atado a un particular Activity/Fragment. Así que una vez que Activity/Fragment se destruye, es ViewModel alcanza un estado despejado. Por lo tanto, cancela todos los trabajos incompletos. empezado por viewModelScope, lanzamiento CancellationException.

Entonces un caso de uso de viewModelScope está dentro ViewModel cuando tienes que llamar a una función suspendida y necesitas una CoroutineScope, a pesar de hacer uno nuevo, puede usar este directamente desde la caja de viewodel-ktx Biblioteca.

class SomeViewModel: ViewModel() 

    fun someFunction() 
        viewModelScope.launch 
            callingSomeSuspendedFun()
            callingAnotherSuspendedFun()
        
    

Tenga en cuenta que no es necesario anular explícitamente onCleared() método de ViewModel para cancelar el alcance, lo hace automáticamente por ti, ¡salud!

2. LiveDataScope:

Ahora hablando de LiveDataScope, en realidad es una interfaz que se proporciona para crear un mejor soporte para LiveData/CoroutineLiveData que puede tener CoroutineScope ¡fuera de la caja! usar livedata-ktx versión

Ahora imagine una situación en la que tiene un patrón MVVM y desea regresar LiveData desde el repositorio para ver el modelo. su repositorio también contiene algunas funciones suspendidas y algunos alcances de rutina.

En esa situación, cuando realiza algunas llamadas a métodos suspendidos y devuelve el resultado como datos en vivo, habría un trabajo adicional. necesitará transformar sus datos en datos en vivo particulares después de obtenerlos como resultado. vea el ejemplo a continuación:

class SomeRepository 

    suspended fun someApiCall() : LiveData 
        val result = MutableLiveData()
        someCoroutineScope.launch 
            val someData = someOtherCallToGetResult()
            result.postValue(someData) 
        
        return result
    

Imagina que tienes que escribir el bloque de código anterior debido a LiveData no tenía ningún apoyo para Coroutines … pero hasta ahora!

Ahora puedes usar directamente liveData función que te devuelve LiveData objeto que te da el alcance de LiveDataScope de tal manera que pueda continuar su trabajo suspendido y emitir el resultado al mismo nivel en lugar de hacerlo de manera desordenada como el anterior. Entonces, el bloque de código anterior ahora se puede optimizar siguiendo el código o mejor:

class SomeRepository 

    suspended fun someApiCall() : LiveData 
        return liveData 
            val someData = someOtherCallToGetResult()
            emit(someData)
        
    

Por lo tanto, el caso de uso de liveData sería a nivel de repositorio cuando se usa el patrón MVVM si expone LiveData al modelo de vista desde el repositorio en lugar de crear un nuevo modelo de vista interno. Tenga en cuenta que no existe una regla general sobre liveData El método no debe usarse directamente en viewmodel. Puedes si quieres evitar viewModelScope completamente.


TL; DR

Revisar la datos en tiempo real método,

Doc afirma que, liveData bloque de construcción sirve como un
primitiva de concurrencia estructurada entre corrutinas y LiveData. El bloque de código comienza a ejecutarse cuando LiveData se activa y se cancela automáticamente después de un tiempo de espera configurable cuando el LiveData se vuelve inactivo. Si se cancela antes de completarse, se reinicia si el LiveData se activa de nuevo. Si se completó correctamente en una ejecución anterior, no se reinicia. Tenga en cuenta que se reinicia solo si se cancela automáticamente. Si el bloqueo se cancela por cualquier otro motivo (por ejemplo, lanzar un
CancelationException)
, no se reinicia.

¡Espero que tenga sentido!

Los nombres implican lo que son en realidad:

Se define un ViewModelScope para cada ViewModel en su aplicación. Cualquier corrutina lanzada en este ámbito se cancela automáticamente si se borra ViewModel.

Esto significa que puede realizar algunas tareas (como el procesamiento continuo) en una corrutina que está dentro del alcance de ViewModel. La ventaja es que ya no tiene que preocuparse más cuando el ViewModel se detendrá para detener su corrutina (esto es un gran problema cuando se trabaja con cosas globales como subprocesos de Java). El ciclo de vida de ViewModel está relacionado con el momento en que se realiza una actividad. terminó.

los LiveDataScope se utiliza para emitir valores en el alcance de un LiveData objeto. Esto significa que mientras el LiveData el objeto está vivo y hay suscriptores que funcionarán con la corrutina, sin embargo, una vez que todos los suscriptores estén fuera, la corrutina se detendrá. Esta corrutina también se reinicia una vez que LiveData está activo de nuevo.

Básicamente, estos son 2 contextos de rutina, cada uno responsable del ciclo de vida de su elemento.

PD:

Parece que ViewModelScope se encarga del ciclo de vida automáticamente y puede realizar solicitudes de red en el bloque.

En primer lugar, las solicitudes de red no se pueden realizar desde el hilo principal, normalmente las hace desde el alcance de IO, puede leer más aquí. La segunda cosa es que debería echar un vistazo al ciclo de vida de ViewModel en comparación con Activity si quiere entender por qué LiveDataScope generalmente se combina con ViewModelScope, Puedes leer sobre eso aquí.

La respuesta breve a su pregunta es que no puede estar seguro de que la vista se crea desde el ViewModelScope por lo tanto, si desea enviar algunas actualizaciones a la interfaz de usuario, debe hacerlo siempre que alguien esté suscrito a LiveData, aquí es donde LiveDataScope entra en juego.

Reseñas y valoraciones

No se te olvide dar visibilidad a este escrito si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *