RxJava 2 — библиотека реактивного программирования для Java/Kotlin
RxJava — это реализация ReactiveX (Rx) для JVM, позволяющая работать с асинхронными и событийными программами в декларативном стиле.
🔥 Основные концепции RxJava 2
1. Реактивное программирование
Программирование с потоками данных (Observables), где подписчики реагируют на изменения.
2. Базовая триада RxJava
Observable
— источник данных (может испускать 0, 1 или множество значений).Observer
— подписчик, который получает данные (или ошибку).Operator
— преобразователь данных (map
,filter
,flatMap
и др.).
3. Backpressure
Механизм контроля скорости передачи данных (например, если Observable
emits быстрее, чем Observer
consumes).
⚡ Примеры кода
1. Простой Observable
Observable.just("Hello", "World")
.subscribe(
value -> System.out.println(value), // onNext
error -> error.printStackTrace(), // onError
() -> System.out.println("Done!") // onCompleted
);
2. Операторы (map, filter)
Observable.range(1, 10)
.map(num -> num * 2) // Умножаем каждый элемент на 2
.filter(num -> num > 5) // Оставляем числа > 5
.subscribe(System.out::println); // 6, 8, 10, ...
3. Асинхронность (Schedulers)
Observable.fromCallable(() -> fetchDataFromNetwork())
.subscribeOn(Schedulers.io()) // Запуск в фоновом потоке
.observeOn(AndroidSchedulers.mainThread()) // Результат — в UI-поток
.subscribe(data -> updateUI(data));
4. Flowable (для Backpressure)
Flowable.range(1, 1000000)
.onBackpressureBuffer() // Стратегия обработки перегрузки
.observeOn(Schedulers.computation())
.subscribe(System.out::println);
🌟 Ключевые компоненты RxJava 2
1. Типы источников данных
Observable
(0..N элементов, без backpressure).Flowable
(0..N элементов, с backpressure).Single
(1 элемент или ошибка).Maybe
(0 или 1 элемент).Completable
(нет данных, только успех/ошибка).
2. Schedulers (потоки выполнения)
Schedulers.io()
— для I/O-операций (сеть, БД).Schedulers.computation()
— для CPU-intensive задач.AndroidSchedulers.mainThread()
— главный поток (Android).
3. Операторы
- Создание:
just
,from
,interval
,defer
. - Преобразование:
map
,flatMap
,concatMap
,switchMap
. - Фильтрация:
filter
,take
,skip
,distinct
. - Комбинирование:
merge
,zip
,concat
.
📉 Проблемы и решения
1. Утечки памяти
- Решение: Отписываться через
Disposable
:
Disposable disposable = observable.subscribe(...);
disposable.dispose(); // В onDestroy()
2. Сложность отладки
- Решение: Добавлять логирование через
doOnNext
,doOnError
.
3. Backpressure в Observable
- Решение: Использовать
Flowable
и стратегии (BUFFER
,DROP
,LATEST
).
🔄 RxJava 2 vs. RxJava 3
Критерий | RxJava 2 | RxJava 3 |
---|---|---|
Поддержка | Заморожена | Актуальная версия |
API | io.reactivex | io.reactivex.rxjava3 |
Нововведения | — | Flowable улучшен, новые операторы |
🚀 Применение RxJava 2
✅ Асинхронные запросы (сеть, БД).
✅ Обработка событий UI (клики, ввод текста).
✅ Сложные цепочки операций (например, автодополнение поиска).
📚 Как выучить RxJava 2?
- Документация: ReactiveX.io.
- Книги: «Reactive Programming with RxJava» (Tomasz Nurkiewicz).
- Практика:
- Реализовать поиск с debounce.
- Объединить 2 API-запроса в один поток.
💡 Советы
✔ Избегайте вложенных подписок (используйте flatMap
).
✔ Тестируйте с TestScheduler
.
✔ Для Android — используйте AutoDispose
или RxLifecycle
.
🔥 Вывод
RxJava 2 — это мощный инструмент для:
- Упрощения асинхронного кода.
- Реактивной работы с потоками данных.
- Композиции сложных операций.
Альтернативы:
- Kotlin Coroutines (более простой подход в Kotlin).
- Project Reactor (для Spring).