¿Cuándo usar RxJava en Android y cuándo usar LiveData desde componentes arquitectónicos de Android?


No estoy obteniendo la razón para usar RxJava en Android y LiveData desde Android Architectural Components.It sería realmente útil si los casos de uso y las diferencias entre los dos se explican junto con el ejemplo de ejemplo en forma de código que explica las diferencias entre los dos.

Author: Scott Merritt, 2017-09-20

5 answers

Android LiveData es una variante del patrón original del observador, con la adición de transiciones activas/inactivas. Como tal, su alcance es muy restrictivo.

Usando el ejemplo descrito en Android LiveData, se crea una clase para monitorear los datos de ubicación y registrar y anular el registro según el estado de la aplicación.

RxJava proporciona operadores que son mucho más generalizados. Supongamos que este observable proporcionará datos de ubicación:

Observable<LocationData> locationObservable;

El la implementación del observable se puede construir usando Observable.create() para mapear las operaciones de devolución de llamada. Cuando el observable está suscrito, 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 es 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:

Observable<Boolean> isActive;

Entonces puede proporcionar toda la funcionalidad de LiveData por el siguiente

Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );

El operador switchMap() proporcionará la ubicación actual como un flujo, o nada si la aplicación no está activa. Una vez que tenga el liveLocation observable, hay muchas cosas que puede hacer con él usando operadores RxJava. Mi ejemplo favorito es:

liveLocation.distinctUntilChanged()
  .filter( location -> isLocationInAreaOfInterest( location ) )
  .subscribe( location -> doSomethingWithNewLocation( location ) );

Que solo realizará la acción cuando la ubicación cambie, y la ubicación sea interesante. Puede crear operaciones similares que combine operadores de tiempo para determinar la velocidad. Más importante aún, usted puede proporcione un control detallado de si las operaciones ocurren 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 las operaciones proporcionadas por la biblioteca, o incluso las operaciones personalizadas que usted proporciona.

LiveData aborda solo una pequeña parte de ese universo, el equivalente de construir el liveLocation.

 64
Author: Bob Dalgleish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 16:18:55

Con respecto a la pregunta original, tanto RxJava como LiveData se complementan muy bien.

LiveData brilla en la capa ViewModel, con su estrecha integración con Android lifecycles y ViewModel. RxJava proporciona más capacidades en transformaciones (como mencionó @Bob Dalgleish).

Actualmente, estamos usando RxJava en las capas de origen y repositorio de datos, y se transforma en LiveData (usando LiveDataReactiveStreams) en ViewModels (antes de exponer datos a actividades / fragmentos) - bastante contento con este enfoque.

 49
Author: kzotin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-11 20:05:51

De hecho, LiveData no es una herramienta esencialmente diferente a RxJava, así que ¿por qué se introdujo como un componente de arquitectura cuando RxJava podría haber gestionado fácilmente el ciclo de vida almacenando todas las suscripciones a observables en un objeto CompositeDispoable y luego disponiéndolas en onDestroy() del Activity o onDestroyView() del Fragment usando solo una línea de código?

He respondido a esta pregunta completamente 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 primero anular los métodos de ciclo de vida relevantes además de tener el conocimiento básico del ciclo de vida. Esto todavía podría no tener sentido para algunos, pero el hecho es que de acuerdo con una de las sesiones de Jetpack en Google I/O 2018 muchos desarrolladores encuentran compleja la gestión 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 ciclo de vida, olvidarse de cuidar de que en cada Actividad / Fragmento que utilizan en su aplicación. En aplicaciones grandes, esto podría convertirse en un problema, a pesar del efecto negativo que podría tener en la productividad.

La conclusión es que al introducir LiveData, se espera que un mayor número de desarrolladores adopten MVVM sin siquiera tener que entender la gestión del ciclo de vida, la fuga de memoria y el bloqueo. Aunque no tengo ninguna duda de que LiveData no es comparable con RxJava en términos de capacidades y el poder que da a los desarrolladores, la programación reactiva y RxJava es un concepto y una herramienta difícil de entender para muchos. Por otro lado, no creo que LiveData esté destinado a ser un reemplazo de RxJava, simplemente no puede, sino una herramienta muy simple para manejar un controvertido problema generalizado experimentado por muchos desarrolladores.

 11
Author: Ali Nem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 12:02:23

Como usted puede saber en el ecosistema reactivo tenemos un Observable que emite datos y un Observador que suscribe( recibe 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 notificación de que algo Observable grita en un momento dado.

Piense en LiveData como un Observable que le permite administrar los Observadores que están en un estado active. En otros términos LiveData es un simple Observable 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) por lo general instanciar LiveData en el ViewModel para mantener el cambio de orientación (puede tener LiveData que es de solo lectura, o MutableLiveData que es escribible, por lo que generalmente se expone fuera de la clase LiveData)

2) en el método OnCreate de la actividad Main (no el ViewModel) usted "suscribe" un objeto Observer (generalmente un método a onChanged)

3) se inicia el método observar para establecer el enlace

Primero el ViewModel (posee la lógica de negocio)

class ViewModel : ViewModel() { //Point 1

var liveData: MutableLiveData<Int> = MutableLiveData()

}

Y este es el MainActivity( tan tonto como sea posible) class MainActivity: AppCompatActivity () {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java)

        ViewModelProvider.observe(this, Observer {//Points 2 and 3
            //what you want to observe
        })


        }
    }
  }

B) Esta es la implementación básica de RxJava

1) usted declara un Observable

2) usted declara un Observador

3) se suscribe el Observable con el Observador

Observable.just(1, 2, 3, 4, 5, 6) // Point 1

   .subscribe(new Subscriber() {    //Points 2 & 3
       @Override
       public void onCompleted() {
           System.out.println("Complete!");
       }

       @Override
       public void onError(Throwable e) {
       }

       @Override
       public void onNext(Double value) {
           System.out.println("onNext: " + value);
       }
    });

En particular LiveData se usa con Lifecycle y a menudo con ViewModel (como hemos visto) componentes de arquitectura. De hecho, cuando LiveData se combina con un ViewModel le permite mantener actualizado en tiempo real cada cambio en el Observador, para que los eventos se gestionen en tiempo real donde sea necesario. Para utilizar LiveData es muy recomendable conocer el concepto de lifecycley los objetos relativos LifecycleOwner/LifeCycle, también le sugeriría que eche un vistazo a Transformaciones, si desea implementar LiveData en escenarios de la vida real. Aquí puede encontrar algunos casos de uso de la gran commonswear.

Para terminar básicamente LiveData es un RXJava simplificado, una forma elegante de observar los cambios en múltiples componentes sin crear reglas de dependencia explícitas entre los componentes, para que pueda probar mucho más fácil el código y hacerlo mucho más legible. RxJava, le permite hacer las cosas de LiveData y mucho más. Debido a las funcionalidades extendidas de RxJava, ambos pueden usar LiveData para casos simples o explotar toda la potencia de RxJava seguir usando componentes de arquitectura Android como el ViewModel , por supuesto esto significa que RXJava puede ser mucho más complejo, solo piense que tiene cientos de operadores en lugar de switchMap y Map of LiveData (en momento).

RxJava versión 2 es una biblioteca que revolucionó el paradigma orientado a Objetos, agregando una llamada forma funcional de administrar el flujo del programa.

 8
Author: trocchietto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 07:47:20

LiveData es un subconjunto de los componentes de la arquitectura de Android desarrollado por android team.Con los datos en vivo y otros componentes de arquitectura (Es el mejor ajuste para Android.Las fugas de memoria, etc. son manejadas por componentes de arquitectura.Ya que está desarrollado por Android team.So se adapta mejor a Android, proporcionan actualizaciones con respecto a las nuevas versiones de Android, etc.) podemos hacer lo que podemos lograr en RxJava.
Si desea utilizar en Android solo significa ir a la arquitectura de Android componentes y si desea utilizar el módulo ur en Android y otros medios (aplicación Java,etc.) vaya a RxJava (react native)

 1
Author: SIVAKUMAR.J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 06:16:42