Что Нового В Rxjava 3

Весной 2020 года вышла новая версия фреймворка.

RxJava – RxJava 3. Давайте рассмотрим, в чем основные изменения, как можно перейти с RxJava 2 на новую версию и стоит ли вообще переходить.

Отметим, что глобальных изменений в новой версии нет, но появилась поддержка Java 8, а пользоваться библиотекой стало удобнее.



Что нового в RxJava 3

Отказ от ответственности: эта статья основана на Обзор GitHub Кроме того, мы делимся впечатлениями наших мобильных разработчиков от RxJava 3, но не претендуем на исчерпывающее исследование — ведь новая версия вышла недавно и практического опыта пока мало.

Если у вас есть дополнения, пишите в комментариях, будем рады обсудить)



Ключевые изменения в RxJava 3

Итак, что мы видим в RxJava 3 :
  • Базовая версия Java увеличена до 8*;
  • Появилась поддержка таких возможностей языка, как:
—Потоки — Сборщики потоков - Необязательный - Завершенная функция *Для использования API Java8 вам нужно поднять minSDK до 24 версии.

В свою очередь разработчики удалили поддержку таких функций как:

  • java.time.Duration – генерирует большое количество перегрузок, всегда можно заменить на время + единица измерения;
  • java.util.function – не может генерировать исключения, а перегрузки могут создавать ненужную «двусмысленность».

Структура пакета также изменилась:

Что нового в RxJava 3

Представленные изменения можно разделить на 2 группы:
  1. Поведенческие изменения
  2. Изменения API


Поведенческие изменения

  • Все ошибки будут обработаны
Раньше одной из проблем RxJava 2 было то, что в некоторых случаях ошибки могли теряться и не обрабатываться.

Теперь в RxJava 3 отписка от источника, который может выдать ошибку, инициирует выдачу этой ошибки в общий обработчик ошибок через RxJavaPlugins.onError().



Что нового в RxJava 3

  • Connectable.reset()
В RxJava 2 была проблема с горячими источниками: при получении события терминала ConnectableObservable новые соединения игнорировали все элементы и получали только событие завершения.

В RxJava 3 появилась функция сброса состояния ConnectableObservable с помощью функции сброса(), чтобы позволить новым подключенным подписчикам обрабатывать данные.



Что нового в RxJava 3



Что нового в RxJava 3

  • Возможность приостановить Flowable.publish
В RxJava 3 после получения определенного количества значений работа Flowable.publish приостанавливается, а оставшиеся элементы доступны следующим подписчикам.



Что нового в RxJava 3

  • Нулевой параметр Processor.offer()
Если вы попытаетесь вызвать PublishProcessor.offer(), BehaviourProcessor.offer() или MulticastProcessor.offer() и передать значение null, вместо передачи ошибки обработчику onError выдается исключение NullPointerException, которое запускает состояние терминала.



Что нового в RxJava 3

  • CompositeException.getCause()
Раньше в RxJava 2 метод getCause() иногда существенно загружал память, вызывая метод initCause для каждого исключения, работал нестабильно и не всегда генерировал цепочку исключений.

В новой версии этот метод был изменен изнутри и теперь генерирует цепочку ошибок в виде трассировки стека — просто путем форматирования строк.



Что нового в RxJava 3



Что нового в RxJava 3

  • Изменены исключения при проверке параметров.

Если параметр недействителен, некоторые операторы теперь будут выдавать IllegalArgumentException вместо IndexOutOfBoundsException: -пропускать - пропустить последний — взять последний - takeLastTimed
  • Предварительное закрытие исходников для fromX()
Библиотеки fromAction() и fromRunnable() стали совместимыми с другими вызовами fromX().

Обратные вызовы fromRunnable() и fromAction() теперь будут закрываться немедленно при соответствующем вызове.

В RxJava 2 закрытие этих операторов происходило после завершения выполнения тела лямбды, переданной в параметрах.



Что нового в RxJava 3

  • Процедура очистки ресурса при использовании using()
Оператор using() имеет параметр, определяющий, когда используемый ресурс будет очищен (true — до завершения, false — после).

В более ранней версии библиотеки этот параметр игнорировался, и ресурс всегда очищался до достижения терминального состояния, но в RxJava 3 все работает корректно.



Что нового в RxJava 3



Изменения API

  • Обработка исключений функциональных интерфейсов новой версии библиотеки расширена с Exception до Throwable.
  • Новые типы: Поставщик
В RxJava 3 в связи с расширением функциональных исключений интерфейса с Exception на Throwable был введен новый тип Поставщик — аналог Callable, но с throws Throwable.

Что нового в RxJava 3

  • В RxJava 3 операторы преобразования одного источника данных в другой заменены на конкретные преобразователи.



Что нового в RxJava 3



Что нового в RxJava 3

  • Перемещенные компоненты
В связи с тем, что RxJava3 будет поддерживать API Java8, пришло новое решение по замене отдельных фабричных классов: методы этих фабрик стали статическими методами самого интерфейса Disposable. Как было раньше:

Что нового в RxJava 3

Стал:

Что нового в RxJava 3

  • Чтобы уменьшить количество предупреждений, класс DisposableContainer, который использовался внутри CompositeDisposable, стал частью публичного API.
  • Некоторые операторы в RxJava 2 находились на стадии эксперимента, а в третьей версии стали стандартными операторами:
Плавные акции дематериализовать (функция) Заметные акции дематериализовать (функция) Возможно, акции doOnTerminate (Действие) материализовать() Одиночные акции дематериализовать (функция) материализовать() Полные акции задержкаПодписка (длинная, TimeUnit) задержкаПодписка (длинная, TimeUnit, Планировщик) материализовать()
  • В новой версии библиотеки оператор конкатмап() ради гибкости в управлении потоками был перегружен Планировщиком


Что нового в RxJava 3

  • Добавлена перегрузка операторов.

    блокировкаForEach() с возможностью указать размер буфера



Что нового в RxJava 3



Что нового в RxJava 3



Что нового в RxJava 3



Что нового в RxJava 3



Что нового в RxJava 3

  • Произошло обновление различных типов источников данных с операторами fromX().



Что нового в RxJava 3



Что нового в RxJava 3

  • Оператор в будущее() теперь доступен для использования в Maybe и Completable
  • Оператор ofType() теперь доступно для использования в Maybe и Single
  • Оператор doOnLifecycle() теперь доступно для использования в режимах Maybe, Single и Completable.
  • Оператор concatMapX() (X — еще один тип источника данных) теперь доступен для использования в Maybe и Single.
  • Оператор concatDelayError() теперь доступно для использования в режимах Maybe, Single и Completable.
  • Оператор слияниеArray() теперь доступно для использования в одиночном режиме


Что нового в RxJava 3

  • Оператор начатьС() теперь доступно для использования во всех пяти типах источников данных
текучий startWith(Может быть, источник) startWith(SingleSource) startWith(CompleteSource) наблюдаемый startWith(Может быть, источник) startWith(SingleSource) startWith(CompleteSource) Может быть startWith(Издатель) startWith (ОбсерваблеИсточник) startWith(Может быть, источник) startWith(SingleSource) startWith(CompleteSource) Одинокий startWith(Издатель) startWith (ОбсерваблеИсточник) startWith(Может быть, источник) startWith(SingleSource) startWith(CompleteSource) Полный startWith(Может быть, источник) startWith(SingleSource)
  • Оператор onErrorReturn() теперь доступен для использования в Completable


Что нового в RxJava 3



Что нового в RxJava 3

  • Оператор плоская карта() теперь доступно для использования в одиночном режиме


Что нового в RxJava 3



Что нового в RxJava 3



Что нового в RxJava 3



Новое в Java8

Добавлен новый оператор изНеобязательно() для текучего, наблюдаемого и возможного

Что нового в RxJava 3

Добавлен новый оператор из потока() для текучего и наблюдаемого

Что нового в RxJava 3



Что нового в RxJava 3

Добавлен новый оператор изCompletionStage() для всех пяти типов источников данных

Что нового в RxJava 3



Что нового в RxJava 3

Добавлен новый оператор картаНеобязательно() для Flowable, Observable, Maybe и Single. Он передает только непустые значения

Что нового в RxJava 3

Добавлен новый оператор блокирующийПоток() для текучего и наблюдаемого.

Оператор представляет поток данных как поток, и по завершении работы с ним рекомендуется закрыть поток во избежание разного рода утечек.



Что нового в RxJava 3

Добавлены новые операторы квартираМапСтрим() И конкатмапстрим() для Flowable и Observable — позволяют конвертировать каждый элемент в отдельный поток

Что нового в RxJava 3

Добавлены новые операторы FlattenStreamAsFlowable() И FlattenStreamAsObservable() для Maybe и Single — эквивалентные операторы FlatMapStream() для Observable и Flowable

Что нового в RxJava 3



Что переименовано



Что было удалено из API

Maybe.toSingle(), замена – Возможно.

defaultIfEmpty() подписаться(…, …, …, ), замена – doOnSubscribe() Single.toCompletable(), замена – Одиночный.

ignoreElement() Completable.blockingGet(), замена – Завершаемый.

blockingAwait() повтор(Расписание), замена – наблюдатьВкл (Планировщик) дематериализовать(), замена – десериализовать (функция) onExceptionResumeNext(), замена – onErrorResumeNext (функция) joinLatest() (с параметром vararg), замена – объединитьLatestArray() fromFuture() (с параметром Scheduler), замена – подписаться на() concatMapIterable() (с параметром буфера), замена – concatMapIterable (функция) Следующие методы также были удалены из TestSubscriber и TestObserver:

Что нового в RxJava 3



Как мигрировать

Многие разработчики отмечают, что переход с RxJava 2 на RxJava 3 — довольно трудоемкий процесс.

Есть два варианта осуществления перехода:

  • иметь в своем проекте обе версии библиотеки;
  • провести полную миграцию на RxJava 3, при этом можно использовать специальную библиотека .

Итак, как мигрировать:
  • Обновите работу с API — используйте аналоги тех методов RxJava 2, которые подвергались изменениям.

  • Важно учитывать, что некоторые сторонние библиотеки до сих пор «сидят» на RxJava 2. Для упрощения перехода можно взять RxJavaBridge , который скрывает под капотом большую часть миграции.

  • При использовании в проекте модернизации его необходимо затянуть.

    RxJava3CallAdapterFactory или создайте свою собственную фабрику для правильного отображения ответов.



Заключение

Мы рассмотрели, что нового в RxJava 3. Теперь попробуем ответить на главный вопрос — стоит ли вообще мигрировать? RxJava 3 — это практически улучшение API. В связи с тем, что серьезных изменений не произошло, необходимости переходить на последнюю версию прямо сейчас, как правило, нет. Сам переход требует усилий, при этом многие сторонние библиотеки все еще связаны с RxJava 2; для работы с Java8 дополнительно потребуется поднять minSDK до 24 версии.

У некоторых команд есть и альтернативные решения — например, использовать Kotlin Coroutines. Однако стоит отметить, что RxJava 2 сейчас переходит в режим «обслуживания», а это означает, что обновления будут заключаться только в исправлении ошибок.

Ожидается, что поддержка второй версии завершится 28 февраля 2021 года.

Спасибо за внимание! Надеемся, что этот материал был вам полезен.

Теги: #Android #Разработка Android #Разработка мобильных приложений #разработка мобильных приложений #мобильные приложения #Kotlin #rxjava #rx #Реактивное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.