No obtengo la razón para usar RxJava en Android y LiveData de Android Architectural Components. Sería realmente útil si los casos de uso y las diferencias entre ambos se explican junto con un ejemplo de ejemplo en forma de código que explica las diferencias entre ambos.
186
Respuestas:
Android LiveData es una variante del patrón de observación original, con la incorporación de transiciones activas / inactivas. Como tal, es muy restrictivo en su alcance.
Usando el ejemplo descrito en Android LiveData , se crea una clase para monitorear los datos de ubicación y registrar y cancelar el registro en función del estado de la aplicación.
RxJava proporciona operadores que están mucho más generalizados. Supongamos que este observable proporcionará datos de ubicación:
La implementación del observable se puede construir utilizando
Observable.create()
para mapear las operaciones de devolución de llamada. Cuando el observable se suscribe, la devolución de llamada se registra, y cuando se cancela la suscripción, la devolución de llamada no se registra. La implementación se ve muy similar al código proporcionado en el ejemplo.Supongamos también que tiene un observable que emite true cuando la aplicación está activa:
Entonces puede proporcionar toda la funcionalidad de LiveData de la siguiente manera
El
switchMap()
operador proporcionará la ubicación actual como una secuencia o nada si la aplicación no está activa. Una vez que tenga elliveLocation
observable, hay muchas cosas que puede hacer con los operadores de RxJava. Mi ejemplo favorito es:Eso solo realizará la acción cuando la ubicación haya cambiado, y la ubicación sea interesante. Puede crear operaciones similares que combinen operadores de tiempo para determinar la velocidad. Más importante aún, puede proporcionar un control detallado de si las operaciones suceden en el subproceso principal o en un subproceso en segundo plano o en varios subprocesos, utilizando operadores RxJava.
El punto de RxJava es que combina el control y el tiempo en un solo universo, utilizando operaciones proporcionadas por la biblioteca, o incluso operaciones personalizadas que usted proporciona.
LiveData se dirige solo a una pequeña parte de ese universo, el equivalente a construir el
liveLocation
.fuente
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
Pero no es consciente el ciclo de vida de LiveData. Si tuviéramos que usar Rx, ¿no tendríamos que manejar los cambios del ciclo de vida?En cuanto a la pregunta original, tanto RxJava como LiveData se complementan muy bien.
LiveData
brilla en la capa ViewModel, con su estrecha integración con los ciclos de vida y AndroidViewModel
.RxJava
proporciona más capacidades en transformaciones (como lo menciona @Bob Dalgleish).Actualmente, estamos usando
RxJava
fuentes de datos y capas de repositorio, y se transforma enLiveData
(usandoLiveDataReactiveStreams
) en ViewModels (antes de exponer datos a actividades / fragmentos), bastante contento con este enfoque.fuente
observeOn
, loLiveDataReactiveStreams
hace de todos modos llamandoLiveData.postValue()
. Y no hay garantía de que susubscribeOn
voluntad tenga ningún efecto en general.Hay muchas diferencias entre LiveData y RxJava:
fuente
onCleared
.De hecho,
LiveData
no es una herramienta esencialmente diferenteRxJava
, entonces, ¿por qué se introdujo como un componente de arquitectura cuandoRxJava
podría haber gestionado fácilmente el ciclo de vida almacenando todas las suscripciones enCompositeDispoable
objetos observables en un objeto y luego eliminándolosonDestroy()
delActivity
oonDestroyView()
delFragment
usando solo uno? línea de código?He respondido completamente a esta pregunta construyendo una aplicación de búsqueda de películas una vez usando RxJava y luego usando LiveData aquí .
Pero en resumen, sí, podría, pero eso necesitaría anular primero los métodos relevantes del ciclo de vida además de tener el conocimiento básico del ciclo de vida. Es posible que esto todavía no tenga sentido para algunos, pero el hecho es que, según una de las sesiones de Jetpack en Google I / O 2018, muchos desarrolladores encuentran complejo el manejo del ciclo de vida. Los errores de bloqueo que surgen de no manejar la dependencia del ciclo de vida podrían ser otra señal de que algunos desarrolladores, incluso si conocen el ciclo de vida, se olvidan de ocuparse de eso en cada Actividad / Fragmento que usan en su aplicación. En aplicaciones grandes, esto podría convertirse en un problema, a pesar del efecto negativo que podría tener sobre la productividad.
La conclusión es que al presentar
LiveData
, se espera que un mayor número de desarrolladores adopten MVVM sin siquiera tener que comprender la gestión del ciclo de vida, la pérdida de memoria y el bloqueo. Aunque no tengo dudas de queLiveData
no es comparableRxJava
en términos de capacidades y el poder que brinda a los desarrolladores, la programación reactiva yRxJava
es un concepto y una herramienta difíciles de entender para muchos. Por otro lado, no creo queLiveData
esté destinado a ser un reemplazo deRxJava
–simplemente no puede–, sino una herramienta muy simple para manejar un problema polémico generalizado experimentado por muchos desarrolladores.** ACTUALIZACIÓN ** He agregado un nuevo artículo aquí donde he explicado cómo el mal uso de LiveData puede conducir a resultados inesperados. RxJava puede venir a rescatar en estas situaciones
fuente
LiveData
dispondría enonStop
realidadComo puede saber en el ecosistema reactivo, tenemos un Observable que emite datos y un Observador que se suscribe (recibe una notificación) de esta emisión Observable, nada extraño es cómo funciona el llamado Patrón de Observador. Un Observable "grita" algo, el Observador recibe una notificación de que Observable grita algo en un momento dado.
Piense
LiveData
como un Observable que le permite administrar los Observadores que se encuentran en unactive
estado. En otros términos,LiveData
es un Observable simple pero también se encarga del ciclo de vida.Pero veamos los dos casos de código que solicita:
A) Datos en vivo
B) RXJava
A) Esta es una implementación básica de LiveData
1) generalmente crea una instancia de LiveData en ViewModel para mantener el cambio de orientación (puede tener LiveData que es de solo lectura o MutableLiveData que se puede escribir, por lo que generalmente se expone fuera de la clase LiveData)
2) en el
OnCreate
método de la Actividad principal (no en ViewModel) "suscribe" un objeto Observador (generalmente un método onChanged)3) inicia el método observar para establecer el enlace
Primero el
ViewModel
(posee la lógica de negocios)Y este es el
MainActivity
(lo más tonto posible)B) Esta es la implementación básica de RXJava
1) declaras un Observable
2) declaras un observador
3) suscribes el Observable con el Observador
En particular,
LiveData
se utiliza conLifecycle
y a menudo conViewModel
(como hemos visto) componentes de arquitectura. De hecho, cuandoLiveData
se combina con un ViewModel le permite mantenerse actualizado en tiempo real de cada cambio en el Observador, para que los eventos se gestionen en tiempo real donde sea necesario. Para usarlo,LiveData
se recomienda conocer el concepto de ciclo de vida y los objetos relativos LifeCycleOwner / LifeCycle , también le sugiero que eche un vistazo a las Transformaciones , si desea implementarLiveData
en escenarios de la vida real. Aquí puede encontrar algunos casos de uso del gran software común .Para terminar , básicamente,
LiveData
es una simplificaciónRXJava
, una manera elegante para observar los cambios a través de múltiples componentes sin necesidad de crear las denominadas reglas explícitas de dependencia entre los componentes, por lo que se puede probar mucho más fácil el código y hacer que sea mucho más fácil de leer. RXJava, te permite hacer cosas de LiveData y mucho más. Debido a las funcionalidades extendidas de RXJava, puede usar LiveData para casos simples o explotar todo el poder de RXJava para seguir usando los componentes de Android Architecture como ViewModel , por supuesto, esto significa queRXJava
puede ser mucho más complejo, solo piense que tiene cientos de operadores en su lugar de SwitchMap y Map of LiveData (por el momento).RXJava versión 2 es una biblioteca que revolucionó el paradigma orientado a objetos, agregando una forma funcional llamada para administrar el flujo del programa.
fuente
LiveData es un subconjunto de los componentes de la arquitectura de Android desarrollado por el equipo de Android.
Con los datos en vivo y otros componentes de la arquitectura, los componentes de la arquitectura manejan las pérdidas de memoria y otros problemas similares. Dado que está desarrollado por el equipo de Android, es el mejor para Android. También proporcionan actualizaciones que manejan nuevas versiones de Android.
Si solo desea usar en el desarrollo de aplicaciones de Android, vaya a los componentes de arquitectura de Android. De lo contrario, si desea usar otra aplicación Java, como aplicaciones web, aplicaciones de escritorio, etc., use RxJava
fuente
LiveData
como titular de datos y nada más. También podemos decir que LiveData es un consumidor consciente del ciclo de vida.LiveData
Se recomienda encarecidamente conocer el concepto de ciclo de vida y los objetos relativos LifeCycleOwner / LifeCycle, obtendrá capacidades de transformación y transmisión para su lógica de negocio y operación consciente del ciclo de vida para su IU.Rx es una herramienta poderosa que permite resolver problemas en un elegante estilo declarativo. Maneja las opciones del lado comercial o las operaciones de Service Api
fuente
Comparar LiveData con RxJava es comparar manzanas con ensaladas de frutas.
Compare LiveData con ContentObserver y está comparando manzanas con manzanas. LiveData efectivamente es un reemplazo consciente del ciclo de vida para ContentObserver.
Comparar RxJava con AsyncTask o cualquier otra herramienta de enhebrado es comparar ensaladas de frutas con naranjas, porque RxJava ayuda con más que solo enhebrar.
fuente
LiveData es parcialmente igual a Rx Subject o SharedRxObservable
LiveData gestiona el ciclo de vida de la suscripción, pero la suscripción de Rx Subject debe crearse y eliminarse manualmente
LiveData no tiene estado de terminación pero Rx Subject tiene OnError y OnCompleted
fuente