Освой RxJava играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Совсем недавно RxJava была на пике популярности, очень многие восторгались новым способом написания приложений, которое называют реактивным программированием. С появлением корутин в Kotlin популярность стала угасать. Тем не менее остались сторонники реактивного программирования, которые продолжают использовать RxJava в своих проектах, в том числе и на языке Kotlin.
Общая страница по реактивному программированию - http://reactivex.io/. Документация по классам здесь.
Домашняя страница на GitHub для RxJava - https://github.com/ReactiveX/RxJava.
С некоторых пор произошло разделение версии на две ветки: 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.
Subscriber переименован в Disposable. А также CompositeSubscription в CompositeDisposable.
В RxJava огромное количество страшных слов, которые следует выучить.
Существуют две сущности: производители и потребители (Observables и Observers). Общая идея состоит в реализации трёх задач - создать поток данных, привести данные в нужный вид, получить исправленные данные.
Первое знакомство. Observable и Observer
Горячие и холодные Observable. ConnectableObservable
TestObserver. Тестирование (Kotlin)
В RxJava есть специальные операторы, с помощью которых можно создавать новые Observable или менять уже существующие. В Java операторы реализованы в виде методов. Как правило, названия оператора совпадает с именем метода или незначительно отличается наличием дополнительных префиксов или суффиксов.
Полная страница операторов в алфавитном порядке представлена в документации. Желательно самостоятельно пройтись по всем операторам, чтобы знать их возможности. Вдруг вам пригодится какой-то конкретный оператор для ваших задач. Мы рассмотрим только часть популярных операторов.
Также имеется интерактивная схема RxMarbles всех операторов, позволяющая двигать данные, чтобы увидеть работу оператора в действии. Схему ещё называет камешковыми диаграммами. Камешковые диаграммы иллюстрируют работу операторов. Как правило, диаграмма содержит две горизонтальные временные оси, направленные слева направо. Фигурки на диаграммах («камешки») служат для визуализации событий. Есть три типа камушек - круг, пятиугольник и треугольник.
Если поток обработан успешно, то справа рисуется вертикальная чёрточка. В случае ошибки рисуется крестик. Если поток никогда не завершается, то ничего не рисуется на временной шкале.
Между осями располагается оператор, который изменяет последовательность событий, поступающих от исходного Observable и передаваемых в результирующий.
В большинстве случаев операторы выполняются синхронно. Вы создаёте цепочку из операторов и они последовательно выполняются.
В этом и заключается их мощь, когда мы начинаем их комбинировать. Сцепление нескольких операторов, разветвление потока на несколько подпотоков и последующее их слияние – вам нужно выучить некоторых из популярных операторов, чтобы их правильно использовать.
Операторы трансформации и фильтрации
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 также обзавёлся своей библиотекой.