Análisis detallado del ciclo de vida de Rx
Por ejemplo, cuando se utiliza RxJava para suscribirse y ejecutar una tarea de larga duración, si la tarea de larga duración no se completa cuando finaliza la Actividad y la suscripción no se cancela a tiempo, la Actividad no se puede completar. reciclado provocará una pérdida de memoria.
Para resolver este problema, creamos RxLifecycle para permitir que RxJava conozca el ciclo de vida y cancele las suscripciones a tiempo para evitar pérdidas de memoria.
Primero, introduzcamos el uso de RxLifecycle.
Activity/Fragment debe heredar de RxAppCompatActivity/RxFragment. RxAppCompatActivity/RxFragment admite las siguientes clases de contenedor:
Tomando Activity como ejemplo, hay dos métodos principales:
Fragment también tiene los mismos dos métodos. Los nombres de los métodos serán diferentes.
La diferencia entre estos dos métodos es la siguiente:
Este método especifica qué método de ciclo de vida se llama para cancelar la suscripción.
Entre ellos, ActivityEvent es una clase de enumeración correspondiente al ciclo de vida de una actividad.
Ejemplos de uso específicos:
Especifique cancelar la suscripción cuando esté en Destory() del ciclo de vida.
Vincular en un ciclo de vida determinado y darse de baja en el ciclo de vida correspondiente.
Uso de ejemplo:
Vincule la suscripción en onResume () y cancele la suscripción en onPause (), y el ciclo de vida se corresponde entre sí.
Primero, veamos los operadores de compilación.
Como se muestra arriba, ambas formas de vincular el ciclo de vida se implementan mediante el operador de redacción.
componer se usa a menudo junto con un Transformador para transformar un Observable de un tipo en un Observable de otro tipo, asegurando así el encadenamiento de llamadas.
Entonces, comencemos con bindToLifecycle y bindUntilEvent y veamos cómo se usa este operador en RxLifecycle.
Hay un objeto clave en RxAppCompatActivity, llamado BehaviorSubject.
BehaviorSubject enviará el último valor más cercano a la suscripción; si no hay un último valor, se enviará el valor predeterminado.
Por lo tanto, lifecycleSubject continuará enviando el siguiente evento de ciclo de vida ActivityEvent de acuerdo con el ciclo de la suscripción vinculada.
Continúe mirando el código fuente. Tanto bindToLifecycle como bindUntilEvent devuelven un objeto LifecycleTransformer. Entonces, ¿para qué sirve LifecycleTransformer?
LifecycleTransformer implementa varias interfaces de conversión para convertir un objeto Observable/Flowable/Single/Completable/Maybe en otro objeto Observable/Flowable/Single/Completable/Maybe. Objetos completables/posibles. Esta operación se utiliza junto con los operadores de composición descritos anteriormente y se puede utilizar para llamadas encadenadas.
Aquí viene el punto: ¿En qué convierte LifecycleTransformer el objeto Observable original?
¡Aquí es donde entra en juego el operador takeUntil!
Una vez que comprenda lo que hace este operador, probablemente comprenderá que RxLifecycle se da de baja escuchando los datos enviados por el segundo Observable.
Entonces, ¿quién es el segundo objeto de observación?
Es un objeto de observación que se pasa al constructor cuando se crea LifecycleTransformer, así que averigüe cuándo se creó.
Empecemos por el principio:
Este método devuelve el objeto LifecycleTransformer y luego continúa hacia abajo.
Sigue rastreando y pronto estarás más cerca de la verdad.
El objeto se crea en este método y se pasa un objeto Observable. Del método anterior, podemos saber que el objeto es el objeto BehaviorSubject.
Entonces, ¿cuándo envía el objeto sus primeros datos?
Esto depende del método takeUntilEvent anterior.
La clave aquí es lifecycleEvent.equals(evento), que solo enviará los primeros datos cuando el valor ActivityEvent enviado por el objeto secundario de comportamiento sea igual al ciclo de vida independiente. Luego, cuando se envíen los primeros datos, la suscripción se desvinculará según el análisis anterior.
Entonces, ¿cómo se da de baja el método bindToLifecycle en el ciclo de vida correspondiente?
Sigamos viendo el código fuente.
Donde ACTIVITY_LIFECYCLE es:
Esta función devuelve el ciclo de vida correspondiente en función del evento del ciclo de vida entrante, como CREAR → DESTRUIR. Parece que puede usar esa función para desvincularse en el ciclo de vida correspondiente.
Sin embargo, hay muchos operadores necesarios para hacer esto, así que continúa mirando el código fuente.
Más información sobre el método takeUntilCorrespondingEvent.
Primero, veamos el operador de toma. Es muy simple.
take(int) toma un número entero n como parámetro y solo activa los primeros n elementos, como se muestra a continuación:
Luego, el correspondiente lifecycle.take(1).map(respondenceEvents ), que recibe el primer evento del ciclo de vida enviado y lo convierte en una respuesta a través de la función correspondiente anterior. Si onCreate está vinculado, el primer evento enviado es CREATE y se devuelve el DESTORY correspondiente.
skip(int) ignorará los primeros n elementos de datos enviados por Observable
lifecycle.skip(1), si está vinculado en onCreate, los datos restantes son INICIO, REANUDAR, PAUSA , DETENER, DESTRUIR
Finalmente, está el operador clave combineLatest. El operador clave combineLatest se utiliza para darse de baja del ciclo de vida correspondiente.
El operador combineLatest combina los datos emitidos por 2 a 9 observaciones y los emite nuevamente. Pero hay dos requisitos previos:
Por ejemplo, cómo funciona:
Según la función con el tercer parámetro, lifecycle.take(1).map (correspondingEvents) combinado con lifecycle .saltar(1).
El resultado es
OnErrorReturn y el filtro posterior manejarán la excepción y determinarán si la suscripción debe finalizar:
Entonces, siguiendo el ejemplo anterior, si usted en el método onCreate (), cancelará la suscripción en consecuencia en el método onDestory().
A través del análisis anterior, entendemos cómo se utiliza RxLifecycle y cómo funciona.
Al aprender RxLifecycle, tenemos una comprensión más profunda del uso del patrón de observador y el poder de los operadores RxJava, lo que puede ayudarnos a implementar una serie de transformaciones.