Освой RxJava играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

RxJava

Совсем недавно RxJava была на пике популярности, очень многие восторгались новым способом написания приложений, которое называют реактивным программированием. С появлением корутин в Kotlin популярность стала угасать. Тем не менее остались сторонники реактивного программирования, которые продолжают использовать RxJava в своих проектах, в том числе и на языке Kotlin.

Общая страница по реактивному программированию - http://reactivex.io/. Документация по классам здесь.

Домашняя страница на GitHub для RxJava - https://github.com/ReactiveX/RxJava.

Переход на RxJava 2/RxJava 3

С некоторых пор произошло разделение версии на две ветки: 1.x и 2.x.

Ветка 1.x была заморожена 1 июня 2017 (только исправления багов). 31 марта 2018 года ветку закрыли. Я начинал изучать тему на основе 1.x-ветки, поэтому не удивляйтесь, если будут попадаться старые примеры для первой версии. Постараюсь явно предупреждать о подобных случаях, так как различия довольны значительны.

Ветку 2.x заморозили в феврале 2021 года. Теперь следует использовать новую ветку 3.х.

Большинство примеров писалось под версию 2.0, поэтому в статьях возможны ошибки. Решил заново пройтись по статьям и поправить косяки.

Подключаем RxJava.


// Старый способ для RxJava 2
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'

// Новый способ для RxJava 3
implementation "io.reactivex.rxjava3:rxjava:3.0.13"

Разница между двумя ветками 1 и 2 описана на сайте документации. Общие фундаментальные понятия остались прежними. Разница между 2 и 3 описана в другом документе.

Были переименованы или удалены некоторые виды классов Action и Function.

  • Action0 -> Action
  • Action1 -> Consumer
  • Action2 -> BiConsumer
  • ActionN -> Consumer<Object[]>
  • Action3 - Action9 -> удалены
  • Func0 -> Callable
  • Func1 -> Function
  • Func2 -> BiFunction
  • Func3 - Func9 -> Function3 - Function9

Subscriber переименован в Disposable. А также CompositeSubscription в CompositeDisposable.

Классы

В RxJava огромное количество страшных слов, которые следует выучить.

  • Observable
  • Observer
  • Subject, а также PublishSubject, AsyncSubject, BehaviorSubject, ReplaySubject
  • Processor - подвид Subject с поддержкой BackPressure. AsyncProcessor, BehaviorProcessor, PublishProcessor, ReplayProcessor, UnicastProcessor.
  • Future
  • Single - ленивый эквивалент Future.
  • Maybe
  • Completable
  • Consumer
  • Disposable - бывший Subscription из RxJava 1.x
  • Scheduler
  • Flowable

Observable и Observer

Существуют две сущности: производители и потребители (Observables и Observers). Общая идея состоит в реализации трёх задач - создать поток данных, привести данные в нужный вид, получить исправленные данные.

Первое знакомство. Observable и Observer

Горячие и холодные Observable. ConnectableObservable

Single

Maybe

Completable

TestObserver. Тестирование (Kotlin)

Операторы

В RxJava есть специальные операторы, с помощью которых можно создавать новые Observable или менять уже существующие. В Java операторы реализованы в виде методов. Как правило, названия оператора совпадает с именем метода или незначительно отличается наличием дополнительных префиксов или суффиксов.

Полная страница операторов в алфавитном порядке представлена в документации. Желательно самостоятельно пройтись по всем операторам, чтобы знать их возможности. Вдруг вам пригодится какой-то конкретный оператор для ваших задач. Мы рассмотрим только часть популярных операторов.

Также имеется интерактивная схема RxMarbles всех операторов, позволяющая двигать данные, чтобы увидеть работу оператора в действии. Схему ещё называет камешковыми диаграммами. Камешковые диаграммы иллюстрируют работу операторов. Как правило, диаграмма содержит две горизонтальные временные оси, направленные слева направо. Фигурки на диаграммах («камешки») служат для визуализации событий. Есть три типа камушек - круг, пятиугольник и треугольник.

Если поток обработан успешно, то справа рисуется вертикальная чёрточка. В случае ошибки рисуется крестик. Если поток никогда не завершается, то ничего не рисуется на временной шкале.

Между осями располагается оператор, который изменяет последовательность событий, поступающих от исходного Observable и передаваемых в результирующий.

В большинстве случаев операторы выполняются синхронно. Вы создаёте цепочку из операторов и они последовательно выполняются.

В этом и заключается их мощь, когда мы начинаем их комбинировать. Сцепление нескольких операторов, разветвление потока на несколько подпотоков и последующее их слияние – вам нужно выучить некоторых из популярных операторов, чтобы их правильно использовать.

Операторы создания Observable

Операторы трансформации и фильтрации

Операторы объединения

Условные и булевы операторы

Другие операторы

Другие классы

Scheduler

Backpressure

Flowable

Subject

PublishSubject

Disposable

Библиотеки

RxLifecycle - trello/RxLifecycle: Lifecycle handling APIs for Android apps using RxJava. Сам автор библиотеки решил отказаться от своей библиотеки, но пока поддерживает её.

RxBinding - JakeWharton/RxBinding: RxJava binding APIs for Android's UI widgets.

Rx Preferences - f2prateek/rx-preferences: Reactive SharedPreferences for Android

AutoDispose - uber/AutoDispose: Automatic binding+disposal of RxJava 2 streams.

RxKotlin - Kotlin также обзавёлся своей библиотекой.

Реклама