¿Qué hay de nuevo en RxJava 3?

En la primavera de 2020, se lanzó una nueva versión del marco de RxJava , RxJava 3. Veamos cuáles son los principales cambios, cómo puede cambiar de RxJava 2 a la nueva versión y si vale la pena migrar.



Tenga en cuenta que no hay cambios globales en la nueva versión, pero ha aparecido la compatibilidad con Java 8 y la biblioteca se ha vuelto más conveniente de usar.







Descargo de responsabilidad: este artículo se basa en la revisión de GitHub , además, compartimos las impresiones de nuestros desarrolladores móviles de RxJava 3, pero no pretendemos ser un estudio exhaustivo, porque la nueva versión se lanzó recientemente y aún no hay mucha experiencia práctica. Si tiene alguna adición, escriba los comentarios, estaremos encantados de discutir)



Cambios clave en RxJava 3



Entonces, lo que vemos en RxJava 3 :



  • La versión base de Java ahora se incrementa a 8 *;
  • Hay soporte para funciones de lenguaje tales como:


- Streams

- Stream Collectors

- Opcional

- CompletableFeature



* Para usar la API Java8, debe elevar minSDK a la versión 24.



A su vez, los desarrolladores eliminaron la compatibilidad con características tales como:



  • java.time.Duration: genera muchas sobrecargas, siempre se puede reemplazar con time + unit;
  • java.util.function: no se pueden generar excepciones y las sobrecargas pueden crear una "ambigüedad" innecesaria.


La estructura del paquete también ha cambiado:







los cambios presentados se pueden dividir en 2 grupos:



  1. Cambios en el comportamiento
  2. Cambios de API


Cambios en el comportamiento



  • Todos los errores serán procesados


Anteriormente, uno de los problemas con RxJava 2 era que, en algunos casos, los errores podían perderse y no manejarse. Ahora, en RxJava 3, la cancelación de la suscripción de una fuente que podría generar un error provoca que este error se arroje al controlador de errores general a través de RxJavaPlugins.onError ()







  • Connectable.reset ()


Hubo un problema de aguas termales en RxJava 2: al recibir un evento de terminal ConnectableObservable, las nuevas conexiones ignoraron todos los elementos y solo recibieron el evento de finalización.



RxJava 3 introduce una función para restablecer el estado ConnectableObservable utilizando la función reset () para permitir que los suscriptores recién conectados procesen datos.











  • Posibilidad de pausar Flowable.publish


En RxJava 3, después de recibir un cierto número de valores, Flowable.publish se detiene y los elementos restantes están disponibles para los subscriptores posteriores.







  • Processor.offer () parámetro nulo


Si intenta llamar a PublishProcessor.offer (), BehaviourProcessor.offer () o MulticastProcessor.offer () y pasar nulo, se lanza una NullPointerException en lugar de pasar un error al controlador onError y se activa un estado terminal.







  • CompositeException.getCause ()


Anteriormente en RxJava 2, el método getCause () a veces era una carga de memoria significativa, llamando al método initCause en cada excepción, era inestable y no siempre arrojaba una cadena de excepciones.



En la nueva versión, este método se ha cambiado desde adentro y ahora genera una cadena de errores en forma de seguimiento de la pila, mediante el simple formato de cadenas.











  • Se modificaron las excepciones de validación de parámetros.


Si el parámetro no es válido, algunos operadores ahora lanzarán IllegalArgumentException en lugar de IndexOutOfBoundsException:



- skip

- skipLast

- takeLast

- takeLastTimed



  • Fuentes de cierre previo para fromX ()


Las bibliotecas fromAction () y fromRunnable () se han vuelto consistentes con el resto de las llamadas fromX (). Las devoluciones de llamada fromRunnable () y fromAction () ahora se cerrarán instantáneamente cuando se llame en consecuencia. En RxJava 2, estos operadores se cerraron después de que el final de la ejecución del cuerpo del lambda pasó a los parámetros.







  • Orden de limpieza de recursos cuando se usa usando ()


La instrucción using () tiene un parámetro responsable de cuándo se limpiará el recurso utilizado (verdadero - antes de la finalización, falso - después). En la versión anterior de la biblioteca, este parámetro se ignoraba y el recurso siempre se limpiaba antes de obtener el estado del terminal, pero en RxJava 3 todo funciona correctamente.







Cambios de API



  • El manejo de excepciones de interfaces funcionales de la nueva versión de la biblioteca se ha extendido de Excepción a Throwable


  • Nuevos tipos: proveedor


En RxJava 3, en relación con la extensión de excepciones de interfaces funcionales desde Excepción a Throwable, se introdujo un nuevo tipo de Proveedor, análogo a Callable, pero con lanzamientos Throwable







  • En RxJava 3, los operadores para convertir una fuente de datos a otra se han cambiado a convertidores específicos










  • Componentes movidos


Debido al hecho de que RxJava3 admitirá la API Java8, ha surgido una nueva solución para reemplazar las clases de fábrica individuales: los métodos de estas fábricas se han convertido en métodos estáticos de la interfaz desechable.



Como era antes:







ahora:





  • Para reducir las advertencias, la clase DisposableContainer que se utilizó dentro de CompositeDisposable forma parte de la API pública
  • Algunos de los operadores en RxJava 2 estaban en la etapa experimental, y en la tercera versión se convirtieron en operadores estándar:


Flowable promotions



dematerialize(Function)



Observable promotions

dematerialize(Function)



Maybe promotions



doOnTerminate(Action)

materialize()



Single promotions



dematerialize(Function)

materialize()



Complectable promotions



delaySubscription(long, TimeUnit)

delaySubscription(long, TimeUnit, Scheduler)

materialize()







































  • fromX()-




















Flowable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Observable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Maybe

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Single

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Complectable

startWith(MaybeSource)

startWith(SingleSource)































Java8





Se agregó un nuevo operador de Opcional () para Flowable, Observable y Quizás Se





agregó un nuevo operador de Stream () para Flowable y Observable Se









agregó un nuevo operador deCompletionStage () para los cinco tipos de fuente de datos Se









agregó un nuevo operador mapOptional () para Flowable, Observable, Maybe y Single. Solo permite el paso de valores no vacíos . Se







agregó un nuevo operador blockStream () para Flowable y Observable. El operador representa la secuencia de datos como una secuencia, mientras que se recomienda cerrar la secuencia al finalizar el trabajo con ella para evitar todo tipo de fugas. Se







agregaron nuevos operadores flatMapStream () yconcatMapStream () para Flowable y Observable: permite que cada elemento se convierta en una secuencia separada Se







agregaron nuevos operadores flattenStreamAsFlowable () y flattenStreamAsObservable () para Maybe y Single - operadores flatMapStream () equivalentes para Observable y Flowable







¿Qué ha cambiado de nombre?





API



Quizás.toSingle (), reemplazo - Quizás.defaultIfEmpty ()

suscribirse (..., ..., ...,), reemplazo - doOnSubscribe ()

Single.toCompletable (), reemplazo - Single.ignoreElement ()

Completable.blockingGet (), reemplazo - Completable .blockingAwait ()

replay (Scheduler), replace - observeOn (Scheduler)

desmaterialize (), replace - deserialize (Function)

onExceptionResumeNext (), replace - onErrorResumeNext (Function)

combineLatest () (con el parámetro vararg), replace - combineLatestArray ()

fromFuture () (con parámetro Scheduler), reemplazo - subscribeOn ()

concatMapIterable () (con parámetro buffer), reemplazo - concatMapIterable (Función)



También eliminó los siguientes métodos de TestSubscriber y TestObserver:







Cómo migrar



Muchos desarrolladores señalan que migrar de RxJava 2 a RxJava 3 es un proceso bastante laborioso. Hay dos opciones para hacer la transición:



  • tener ambas versiones de la biblioteca en su proyecto;
  • realice una migración completa a RxJava 3, mientras puede usar una biblioteca especial .


Entonces, cómo migrar:



  • Para actualizar el trabajo con la API, use análogos de esos métodos RxJava 2 que han sido sujetos a cambios.
  • Es importante tener en cuenta que algunas bibliotecas de terceros todavía están "sentadas" en RxJava 2. Para simplificar la transición, puede tomar RxJavaBridge , que oculta la mayor parte de la migración.
  • Retrofit RxJava3CallAdapterFactory .




Hemos revisado las novedades de RxJava 3. Y ahora intentemos responder a la pregunta principal: ¿vale la pena migrar?



RxJava 3 es prácticamente una mejora de API. Debido al hecho de que no hubo cambios fundamentales, en general no hay necesidad de migrar a la última versión en este momento. La transición en sí misma requiere esfuerzo, mientras que muchas bibliotecas de terceros todavía están asociadas con RxJava 2, para trabajar con Java8, también necesitará elevar minSDK a la versión 24. Algunos equipos también ofrecen soluciones alternativas, como el uso de Kotlin Coroutines.



Sin embargo, vale la pena señalar que RxJava 2 ahora está entrando en modo de "mantenimiento", lo que significa que solo habrá correcciones de errores de las actualizaciones. Se espera que el soporte para la segunda versión finalice el 28 de febrero de 2021.



! , .



All Articles