Слайд 2Функциональное реактивное программирование (FRP)
Функциональное. Основной элемент – функции.
Реактивное. Программирование с асинхронными потоками
![Функциональное реактивное программирование (FRP) Функциональное. Основной элемент – функции. Реактивное. Программирование с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-1.jpg)
данных.
Функциональное реактивное программирование – программирование с асинхронными потоками данных, которые манипулируются с помощью различных функций.
Слайд 3Что такое поток данных?
Любые объекты и примитивы
Любая последовательность объектов и примитивов
Бесконечные последовательности
Любое
![Что такое поток данных? Любые объекты и примитивы Любая последовательность объектов и](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-2.jpg)
событие (ввод текста, клик на кнопку и так далее)
Слайд 4Ввод текста как поток данных
![Ввод текста как поток данных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-3.jpg)
Слайд 5RxJava
Обеспечение многопоточности
Управление потоками данных
Обработка ошибок
Красивый и компактный код (при использовании лямбда-выражений)
![RxJava Обеспечение многопоточности Управление потоками данных Обработка ошибок Красивый и компактный код (при использовании лямбда-выражений)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-4.jpg)
Слайд 19Observable.fromCallable
Observable.fromCallable(() -> getUserIdsFromDatabase());
![Observable.fromCallable Observable.fromCallable(() -> getUserIdsFromDatabase());](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-18.jpg)
Слайд 20Observable. Создание последовательности
Observable.empty вернет только onCompleted
Observable.error вернет только onError
Observable.never ничего не вернет
values.subscribe(
![Observable. Создание последовательности Observable.empty вернет только onCompleted Observable.error вернет только onError Observable.never](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-19.jpg)
val -> System.out.println("Received: " + val),
error -> System.out.println("Error: " + error),
() -> System.out.println("Completed")
);
Слайд 21subscribeOn и observeOn
Код подписчика (observer) выполняется в потоке, переданном в observeOn
Код потока
![subscribeOn и observeOn Код подписчика (observer) выполняется в потоке, переданном в observeOn](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-20.jpg)
данных выполняется в потоке, переданном в subscribeOn
Слайд 22Schedulers
Schedulers.io() – выполнение задач, которые не сильно нагружают процессор, но являются долгими:
![Schedulers Schedulers.io() – выполнение задач, которые не сильно нагружают процессор, но являются](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-21.jpg)
сетевые запросы, база данных
Schedulers.computation() – тяжелые вычислительные задачи, нагружающие CPU
Schedulers.newThread – новый поток для каждой новой задачи
Schedulers.immediate() – выполнение задачи в том же потоке
AndroidScheduler.mainThread() (RxAndroid) – главный поток Android-приложения
Слайд 23Transformer
Одинаковый код для каждого сетевого запроса
![Transformer Одинаковый код для каждого сетевого запроса](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-22.jpg)
Слайд 41RxJava в Android
Использование RxJava в Android не ограничено
Поддержка RxJava в Retrofit
Реализация стандартных
![RxJava в Android Использование RxJava в Android не ограничено Поддержка RxJava в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-40.jpg)
для Android подходов в реактивном стиле: RxBindings, RxLifecycle и множество других
Слайд 46Other Utility Operators
doOnEach – register an action to take whenever an Observable
![Other Utility Operators doOnEach – register an action to take whenever an](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-45.jpg)
emits an item
doOnCompleted – register an action to take when an Observable completes successfully
doOnError – register an action to take when an Observable completes with an error
doAfterTerminate – register an action to call just after an Observable terminated, either successfully or with an error
doFinally - register an action to call when an Observable terminates or it gets disposed
Слайд 48Возвращаем закэшированнные данные в случае ошибки
![Возвращаем закэшированнные данные в случае ошибки](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-47.jpg)
Слайд 66Maybe.fromAction
Maybe.fromAction(()-> System.out.println(“Hello”));
Maybe.fromRunnable(()-> System.out.println(“Hello”));
Completable.fromAction(()-> System.out.println(“Hello”));
Completable.fromRunnable(()-> System.out.println(“Hello”));
![Maybe.fromAction Maybe.fromAction(()-> System.out.println(“Hello”)); Maybe.fromRunnable(()-> System.out.println(“Hello”)); Completable.fromAction(()-> System.out.println(“Hello”)); Completable.fromRunnable(()-> System.out.println(“Hello”));](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-65.jpg)
Слайд 67Dispose
.subscribe – возвращает объект Disposable, который хранит состояние подписки на текущий момент.
Содержит
![Dispose .subscribe – возвращает объект Disposable, который хранит состояние подписки на текущий](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1169239/slide-66.jpg)
два метода:
isDisposed() – освобождены ли ресурсы
dispose() – освободить ресурсы(отписаться)
В методе onDestroy() всегда стоит вызывать метод dispose()