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 estoViewModel
. Este alcance se cancelará cuandoViewModel
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 yLiveData
. El bloque de código comienza a ejecutarse cuandoLiveData
se activa y se cancela automáticamente después de un tiempo de espera configurable cuando elLiveData
se vuelve inactivo. Si se cancela antes de completarse, se reinicia si elLiveData
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.