Весной 2020 года вышла новая версия фреймворка.
RxJava – RxJava 3. Давайте рассмотрим, в чем основные изменения, как можно перейти с RxJava 2 на новую версию и стоит ли вообще переходить.
Отметим, что глобальных изменений в новой версии нет, но появилась поддержка Java 8, а пользоваться библиотекой стало удобнее.
Отказ от ответственности: эта статья основана на Обзор GitHub Кроме того, мы делимся впечатлениями наших мобильных разработчиков от RxJava 3, но не претендуем на исчерпывающее исследование — ведь новая версия вышла недавно и практического опыта пока мало.
Если у вас есть дополнения, пишите в комментариях, будем рады обсудить)
Ключевые изменения в RxJava 3
Итак, что мы видим в RxJava 3 :- Базовая версия Java увеличена до 8*;
- Появилась поддержка таких возможностей языка, как:
В свою очередь разработчики удалили поддержку таких функций как:
- java.time.Duration – генерирует большое количество перегрузок, всегда можно заменить на время + единица измерения;
- java.util.function – не может генерировать исключения, а перегрузки могут создавать ненужную «двусмысленность».
Представленные изменения можно разделить на 2 группы:
- Поведенческие изменения
- Изменения API
Поведенческие изменения
- Все ошибки будут обработаны
Теперь в RxJava 3 отписка от источника, который может выдать ошибку, инициирует выдачу этой ошибки в общий обработчик ошибок через RxJavaPlugins.onError().
- Connectable.reset()
В RxJava 3 появилась функция сброса состояния ConnectableObservable с помощью функции сброса(), чтобы позволить новым подключенным подписчикам обрабатывать данные.
- Возможность приостановить Flowable.publish
- Нулевой параметр Processor.offer()
- CompositeException.getCause()
В новой версии этот метод был изменен изнутри и теперь генерирует цепочку ошибок в виде трассировки стека — просто путем форматирования строк.
- Изменены исключения при проверке параметров.
- Предварительное закрытие исходников для fromX()
Обратные вызовы fromRunnable() и fromAction() теперь будут закрываться немедленно при соответствующем вызове.
В RxJava 2 закрытие этих операторов происходило после завершения выполнения тела лямбды, переданной в параметрах.
- Процедура очистки ресурса при использовании using()
В более ранней версии библиотеки этот параметр игнорировался, и ресурс всегда очищался до достижения терминального состояния, но в RxJava 3 все работает корректно.
Изменения API
- Обработка исключений функциональных интерфейсов новой версии библиотеки расширена с Exception до Throwable.
- Новые типы: Поставщик
- В RxJava 3 операторы преобразования одного источника данных в другой заменены на конкретные преобразователи.
- Перемещенные компоненты
Стал:
- Чтобы уменьшить количество предупреждений, класс DisposableContainer, который использовался внутри CompositeDisposable, стал частью публичного API.
- Некоторые операторы в RxJava 2 находились на стадии эксперимента, а в третьей версии стали стандартными операторами:
- В новой версии библиотеки оператор конкатмап() ради гибкости в управлении потоками был перегружен Планировщиком
- Добавлена перегрузка операторов.
блокировкаForEach() с возможностью указать размер буфера
- Оператор блокировкаПодписаться() теперь доступно для использования в режимах Maybe, Single и Completable.
- Оператор onErrorComplete() теперь доступно во всех пяти типах источников данных
- Оператор onErrorResumeWith() теперь доступен для использования в Completable
- Оператор повторить до тех пор, пока() теперь доступно для использования в Single и Completable
- Оператор переключательOnNext() И переключательOnNextDelayError() теперь доступно для использования в режимах Maybe, Single и Completable.
- Оператор дематериализовать() теперь доступен для использования в Maybe
- Произошло обновление различных типов источников данных с операторами fromX().
- Оператор временной интервал() теперь доступно для использования в Maybe и Single
- Оператор в будущее() теперь доступен для использования в Maybe и Completable
- Оператор ofType() теперь доступно для использования в Maybe и Single
- Оператор doOnLifecycle() теперь доступно для использования в режимах Maybe, Single и Completable.
- Оператор concatMapX() (X — еще один тип источника данных) теперь доступен для использования в Maybe и Single.
- Оператор concatDelayError() теперь доступно для использования в режимах Maybe, Single и Completable.
- Оператор слияниеArray() теперь доступно для использования в одиночном режиме
- Оператор начатьС() теперь доступно для использования во всех пяти типах источников данных
- Оператор onErrorReturn() теперь доступен для использования в Completable
- Оператор безопаснаяподписка() теперь доступно для использования в режимах Maybe, Single и Completable.
- Оператор плоская карта() теперь доступно для использования в одиночном режиме
- Оператор конкатЕагер() И concatEagerDelayError() теперь доступно для использования в Flowable, Observable, Maybe и Single
- Добавлен оператор отПоставщика() ко всем пяти типам источников данных
Новое в Java8
Добавлен новый оператор изНеобязательно() для текучего, наблюдаемого и возможногоДобавлен новый оператор из потока() для текучего и наблюдаемого
Добавлен новый оператор изCompletionStage() для всех пяти типов источников данных
Добавлен новый оператор картаНеобязательно() для Flowable, Observable, Maybe и Single. Он передает только непустые значения
Добавлен новый оператор блокирующийПоток() для текучего и наблюдаемого.
Оператор представляет поток данных как поток, и по завершении работы с ним рекомендуется закрыть поток во избежание разного рода утечек.
Добавлены новые операторы квартираМапСтрим() И конкатмапстрим() для Flowable и Observable — позволяют конвертировать каждый элемент в отдельный поток
Добавлены новые операторы FlattenStreamAsFlowable() И FlattenStreamAsObservable() для Maybe и Single — эквивалентные операторы FlatMapStream() для Observable и Flowable
Что переименовано
- Вместо startWith() — startWithArray() , startWithIterable() , startWithItem()
- Вместо onErrorResumeNext() — onErrorResumeWith()
- Вместо zipIterable() — zip()
- Вместо joinLatest() (с аргументом массива) — объединитьLatestArray() , объединитьLatestArrayDelayError()
- Вместо Single.equals() - последовательностьEqual(SingleSource, SingleSource)
- Вместо Maybe. FlatMapSingleElement() — Может быть.
FlatMapSingle()
- Вместо Callable — Поставщик (при использовании лямбд требуется только перекомпиляция)
Что было удалено из API
Maybe.toSingle(), замена – Возможно.defaultIfEmpty()
подписаться(…, …, …, ), замена – doOnSubscribe() Single.toCompletable(), замена – Одиночный.ignoreElement()
Completable.blockingGet(), замена – Завершаемый.blockingAwait()
повтор(Расписание), замена – наблюдатьВкл (Планировщик) дематериализовать(), замена – десериализовать (функция) onExceptionResumeNext(), замена – onErrorResumeNext (функция) joinLatest() (с параметром vararg), замена – объединитьLatestArray() fromFuture() (с параметром Scheduler), замена – подписаться на() concatMapIterable() (с параметром буфера), замена – concatMapIterable (функция) Следующие методы также были удалены из TestSubscriber и TestObserver:Как мигрировать
Многие разработчики отмечают, что переход с 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 #Реактивное программирование
-
Комплексный Paas
19 Oct, 24 -
Сколько Времени Люди Проводят В Сети?
19 Oct, 24 -
Uwp — Проблема № 227
19 Oct, 24