SlideShare a Scribd company logo
RX + Android
For Java & Kotlin
Mike Diachenko
Android Developer @ Lohika
О чем поговорим:
- Общая идея: как, зачем, почему
- Observable & Observer - наблюдаемое и
наблюдатель, их роли, примеры
- RxJava - операторы, что такое и какие есть
- Как делать можно
- Как делать не можно
В двух словах о теории RX:
Реактивное программирование - парадигма программирования
построенная на двух китах - потоки данных и пути их распространения
В двух словах о теории RX:
Потоки данных - как в программировании, так и в мире вся
информация движется своими потоками.
Распространение изменений - потоки данных должны иметь
возможность распространять изменения с уведомлением
заинтересованных сторон.
Observable & Observer
Observable - наблюдаемое, именно оно и эмитит поток данных.
Эмитить(emit) - распространять/генерировать/производить/доставлять
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
2. Flowable
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
2. Flowable
3. Single
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
2. Flowable
3. Single
4. Completable
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
2. Flowable
3. Single
4. Completable
5. MayBe
Observable & Observer
Observable - наблюдаемое, именно оно и производит поток данных.
Основные типы observable:
1. Observable
2. Flowable
3. Single
4. Completable
5. MayBe
6. ? Subjects ?
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Основные типы:
1. DefaultObserver
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Основные типы:
1. DefaultObserver
2. DisposableObserver
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Основные типы:
1. DefaultObserver
2. DisposableObserver
3. ResourceObserver
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Основные типы:
1. DefaultObserver
2. DisposableObserver
3. ResourceObserver
4. SafeObserver
Observable & Observer
Observer - наблюдатель, в свою очередь следит за этим потоком и
получает его обновления
Основные типы:
1. DefaultObserver
2. DisposableObserver
3. ResourceObserver
4. SafeObserver
5. SerializedObserver
Observable & Observer
Observer - наблюдатель, в свою очередь следит за потоком данных и
получает его обновления
Основные типы:
1. DefaultObserver
2. DisposableObserver
3. ResourceObserver
4. SafeObserver
5. SerializedObserver
6. ? Subjects ?
Основные типы observable:
Observable
Относительно универсален. Имеет следующие методы:
onNext(value: T)
onComplete()
onError(error: Throwable)
Может эмитить подряд неограниченное количество данных.
При большом количестве данных поступающих быстро, можем
получить BackPressure.
Основные типы observable:
Flowable
Имеет методы аналогичные Observable, но учитывает потенциальный
BackPressure, без потери данных
onNext(value: T)
onComplete()
onError(error: Throwable)
Flowable Observable
Основные типы observable:
Single
В отличии от Observable эмитит данные лишь 1 раз, по сути
объединив onNext & onComplete:
onSuccess(value: T)
onError(error: Throwable)
Основные типы observable:
Completable
В отличии от Single не эмитит данные, а эмитит лишь факт complete
onComplete()
onError(error: Throwable)
Основные типы observable:
MayBe
В отличии от Observable не может вызвать оба метода (как onNext =>
onComplete)
onSuccess(value: T)
onComplete()
onError(error: Throwable)
Обобщённо о наблюдаемых
Все наблюдаемые имеют 2 общих состояния - завершенность
(complete) и ошибка (error)
После обоих состояний мы не можем продолжать обращаться к
потоку данных.
При этом, если у нас нет слушателя onError, мы получим exception,
“не тонко” нам на это намекающий
complete (onComplete()/onSuccess(...))
error (onError)
Основные типы observer:
DefaultObserver
class DefaultObserver<T>: Observer<T>
Классический Observer, именно его мы и используем через Consumer
интерфейс.
Основные типы observer:
DisposableObserver
class DisposableObserver<T>: Observer<T>, Disposable
В отличии от DefaultObserver реализовывает так же disposable, и
можно отписаться либо внутри него, либо по ссылке извне
Основные типы observer:
SafeObserver
class SafeObserver<T>(observer: Observer<T>): Observer<T>,
Disposable
Безопасный наблюдатель. Реализовывает в себе обработку всех
негативных кейсов, таких как передача null в onNextonError и любых
других которые не соответствуют протоколу RxJava2
Принимает в конструктор другого наблюдателя, в который эмитятся
данные при условии соответствия протоколу
Основные типы observer:
SerializedObserver
class SerializedObserver<T>(observer: Observer<T>): Observer<T>,
Disposable
Как и SafeObserver - обёртка, в отличии от остальных наблюдателей
может быть вызвана многоразово так как основная цель -
упорядочить доступ к основному наблюдателю, путём synchronized
блоков и проверок на готовность тех или иных методов.
Subjects
Представляют как Observable так и Observer функциональность,
отличаются поведением.
При этом можно подписаться сразу на несколько Observable.
Subjects
Publish - обновления информации Observer получит с момента
подписки. Прошлые эмиты - не получит
Subjects
Replay - а тут наоборот, всё что было заэмичено - будет
отправлено вновь подписавшемуся
Subjects
Behavior - облегченная версия предыдущего - получит не все
заэмиченные, а последний + всё что будет после подписки
Subjects
Async - в данном случае, обновления получат все участники
строго одинаково - последний апдейт + onComplete. (Даже если
подписались и после подписки было много эмитов)
Операторы
Создания
Трансформации
Фильтрующие
Комбинирующие
Обработки ошибок
Утилитные
Условные и булевые
Математические и аггрегирующие
Соединяющие
Конвертирующие
Операторы создания
Create — создание Observable самостоятельно, используя
методы ObservableEmitter самостоятельно
From — создание из чего-либо, списка, Callable, Runnable,
объекта
Just — конвертирует объект или коллекцию объектов в
Observable которое моментально эмитит
Операторы трансформации
FlatMap — трансформирует объекты полученные из Observable с
применением функции трансформации к каждому объекту, возвращая
в свою очередь новосозданный Observable
Map — трансформирует объекты полученные из Observable
применяя функцию трансформации к каждому
Операторы фильтрации
First — возвращает только первый объект полученный из
Observable
Last — возвращает только последний объект полученный из
Observable
Take — возвращает N первых объектов полученных из
Observable
Комбинирующие операторы
CombineLatest — когда хотя бы 1 из 2х Observable производит
данные - комбинирует его данные с последними данными других
Observable и возвращает единый Observable
Zip — комбинирует результат нескольких Observable и
возвращает единый Observable
Операторы обработки ошибок
Retry — при получении onError уведомления переподписывается,
в надежде на успех
Утилитные операторы
ObserveOn — определяет планировщик на котором наблюдатель
будет наблюдать за наблюдаемым
SubscribeOn — определяет планировщик который будет
использоваться наблюдаемым для своего выполнения
Subscribe — непосредственно подписка на наблюдаемое.
Условные и булевые операторы
All — определяет все ли объекты произведенные Observable
подходят под критерии
Contains — определяет произвел ли Observable конкретный
объект
Mathematical and Aggregate Operators
Max — определяет и возвращает максимальный объект
произведенный Observable
Min — определяет и возвращает минимальный объект
произведенный Observable
Average — определяет и возвращает среднее значение из
объектов произведенных Observable
Bad
Good
Bad
Good
Bad
Good
Bad
Good
Bad
Good
Bad
Good
Вопросы

More Related Content

What's hot

Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
Unguryan Vitaliy
 
Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
Pavel Treshnikov
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. Молодёжно
Vladislav Bezverhiy
 
TAJOUG | Iptables
TAJOUG | IptablesTAJOUG | Iptables
TAJOUG | Iptables
Firdavs Murodov
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
Ilya Lapitan
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
Evgeniy Vinogradniy
 
Часть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеровЧасть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеров
Oleg Popov
 
Podprogram
PodprogramPodprogram
Podprogram
LidiKashka
 
Сервлеты
СервлетыСервлеты
Сервлеты
Unguryan Vitaliy
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
Unguryan Vitaliy
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.
Unguryan Vitaliy
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
Anton Moiseenko
 
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
it-people
 
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекцииКурс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
7bits
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
Unguryan Vitaliy
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
 
Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность
7bits
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 

What's hot (20)

Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. Молодёжно
 
TAJOUG | Iptables
TAJOUG | IptablesTAJOUG | Iptables
TAJOUG | Iptables
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
 
Часть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеровЧасть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеров
 
Podprogram
PodprogramPodprogram
Podprogram
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
 
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекцииКурс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
 
Presentation_1369080393540
Presentation_1369080393540Presentation_1369080393540
Presentation_1369080393540
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 

Similar to Rx android

UAFPUG6 - PureMVC
UAFPUG6 - PureMVCUAFPUG6 - PureMVC
UAFPUG6 - PureMVCmandrew182
 
PureMVC and Papervision
PureMVC and PapervisionPureMVC and Papervision
PureMVC and Papervision
Dmitry Kuriksha
 
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha DmitryUafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha DmitryMax Rozdobudko
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
Alexey Fyodorov
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
Yandex
 
Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментов
Roman Dvornov
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектирования
ksmster
 
Система анализа работы приложений и протоколов Riverbed Cascade
Система анализа работы приложений и протоколов Riverbed CascadeСистема анализа работы приложений и протоколов Riverbed Cascade
Система анализа работы приложений и протоколов Riverbed Cascade
КРОК
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в AkkaZheka Kozlov
 
3-е свидание с functional-js, что дальше
3-е свидание с functional-js, что дальше3-е свидание с functional-js, что дальше
3-е свидание с functional-js, что дальше
Artjoker
 
Сравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФСравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФ
Pete Kuzeev
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Cisco Russia
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
Technopark
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Dmitry Tsitelov
 
Gnevshev мониторинг
Gnevshev   мониторингGnevshev   мониторинг
Gnevshev мониторингkuchinskaya
 

Similar to Rx android (20)

UAFPUG6 - PureMVC
UAFPUG6 - PureMVCUAFPUG6 - PureMVC
UAFPUG6 - PureMVC
 
PureMVC and Papervision
PureMVC and PapervisionPureMVC and Papervision
PureMVC and Papervision
 
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha DmitryUafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
Uafpug 8 Presentation Puremvc Papervision Gallery Kuriksha Dmitry
 
Step 7
Step 7Step 7
Step 7
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментов
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектирования
 
Система анализа работы приложений и протоколов Riverbed Cascade
Система анализа работы приложений и протоколов Riverbed CascadeСистема анализа работы приложений и протоколов Riverbed Cascade
Система анализа работы приложений и протоколов Riverbed Cascade
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
3-е свидание с functional-js, что дальше
3-е свидание с functional-js, что дальше3-е свидание с functional-js, что дальше
3-е свидание с functional-js, что дальше
 
Сравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФСравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФ
 
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностейПакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
Пакетное ядро мобильного оператора: ASR5k, поиски устранение неисправностей
 
ZooKeeper Java Cloud
ZooKeeper Java CloudZooKeeper Java Cloud
ZooKeeper Java Cloud
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
Gnevshev мониторинг
Gnevshev   мониторингGnevshev   мониторинг
Gnevshev мониторинг
 

More from GDG Odessa

Kotlin
KotlinKotlin
Kotlin
GDG Odessa
 
Clean architecture on Android
Clean architecture on AndroidClean architecture on Android
Clean architecture on Android
GDG Odessa
 
BDSM or start programming after Angular one
BDSM or start programming after Angular oneBDSM or start programming after Angular one
BDSM or start programming after Angular one
GDG Odessa
 
Angular 2 vs Angular 1
Angular 2 vs Angular 1Angular 2 vs Angular 1
Angular 2 vs Angular 1
GDG Odessa
 
Release Engineering
Release EngineeringRelease Engineering
Release Engineering
GDG Odessa
 
Angular 1.x in action now
Angular 1.x in action nowAngular 1.x in action now
Angular 1.x in action now
GDG Odessa
 
Понимая Git /git/. Git изнутри наружу
Понимая Git /git/. Git изнутри наружуПонимая Git /git/. Git изнутри наружу
Понимая Git /git/. Git изнутри наружу
GDG Odessa
 
Жизненный цикл React приложений
Жизненный цикл React приложенийЖизненный цикл React приложений
Жизненный цикл React приложений
GDG Odessa
 
React + Redux. Опыт использования
React + Redux. Опыт использованияReact + Redux. Опыт использования
React + Redux. Опыт использования
GDG Odessa
 

More from GDG Odessa (9)

Kotlin
KotlinKotlin
Kotlin
 
Clean architecture on Android
Clean architecture on AndroidClean architecture on Android
Clean architecture on Android
 
BDSM or start programming after Angular one
BDSM or start programming after Angular oneBDSM or start programming after Angular one
BDSM or start programming after Angular one
 
Angular 2 vs Angular 1
Angular 2 vs Angular 1Angular 2 vs Angular 1
Angular 2 vs Angular 1
 
Release Engineering
Release EngineeringRelease Engineering
Release Engineering
 
Angular 1.x in action now
Angular 1.x in action nowAngular 1.x in action now
Angular 1.x in action now
 
Понимая Git /git/. Git изнутри наружу
Понимая Git /git/. Git изнутри наружуПонимая Git /git/. Git изнутри наружу
Понимая Git /git/. Git изнутри наружу
 
Жизненный цикл React приложений
Жизненный цикл React приложенийЖизненный цикл React приложений
Жизненный цикл React приложений
 
React + Redux. Опыт использования
React + Redux. Опыт использованияReact + Redux. Опыт использования
React + Redux. Опыт использования
 

Rx android

  • 1. RX + Android For Java & Kotlin Mike Diachenko Android Developer @ Lohika
  • 2. О чем поговорим: - Общая идея: как, зачем, почему - Observable & Observer - наблюдаемое и наблюдатель, их роли, примеры - RxJava - операторы, что такое и какие есть - Как делать можно - Как делать не можно
  • 3. В двух словах о теории RX: Реактивное программирование - парадигма программирования построенная на двух китах - потоки данных и пути их распространения
  • 4. В двух словах о теории RX: Потоки данных - как в программировании, так и в мире вся информация движется своими потоками. Распространение изменений - потоки данных должны иметь возможность распространять изменения с уведомлением заинтересованных сторон.
  • 5. Observable & Observer Observable - наблюдаемое, именно оно и эмитит поток данных. Эмитить(emit) - распространять/генерировать/производить/доставлять
  • 6. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable
  • 7. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable 2. Flowable
  • 8. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable 2. Flowable 3. Single
  • 9. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable 2. Flowable 3. Single 4. Completable
  • 10. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable 2. Flowable 3. Single 4. Completable 5. MayBe
  • 11. Observable & Observer Observable - наблюдаемое, именно оно и производит поток данных. Основные типы observable: 1. Observable 2. Flowable 3. Single 4. Completable 5. MayBe 6. ? Subjects ?
  • 12. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления
  • 13. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления Основные типы: 1. DefaultObserver
  • 14. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления Основные типы: 1. DefaultObserver 2. DisposableObserver
  • 15. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления Основные типы: 1. DefaultObserver 2. DisposableObserver 3. ResourceObserver
  • 16. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления Основные типы: 1. DefaultObserver 2. DisposableObserver 3. ResourceObserver 4. SafeObserver
  • 17. Observable & Observer Observer - наблюдатель, в свою очередь следит за этим потоком и получает его обновления Основные типы: 1. DefaultObserver 2. DisposableObserver 3. ResourceObserver 4. SafeObserver 5. SerializedObserver
  • 18. Observable & Observer Observer - наблюдатель, в свою очередь следит за потоком данных и получает его обновления Основные типы: 1. DefaultObserver 2. DisposableObserver 3. ResourceObserver 4. SafeObserver 5. SerializedObserver 6. ? Subjects ?
  • 19. Основные типы observable: Observable Относительно универсален. Имеет следующие методы: onNext(value: T) onComplete() onError(error: Throwable) Может эмитить подряд неограниченное количество данных. При большом количестве данных поступающих быстро, можем получить BackPressure.
  • 20.
  • 21. Основные типы observable: Flowable Имеет методы аналогичные Observable, но учитывает потенциальный BackPressure, без потери данных onNext(value: T) onComplete() onError(error: Throwable)
  • 22.
  • 24. Основные типы observable: Single В отличии от Observable эмитит данные лишь 1 раз, по сути объединив onNext & onComplete: onSuccess(value: T) onError(error: Throwable)
  • 25.
  • 26. Основные типы observable: Completable В отличии от Single не эмитит данные, а эмитит лишь факт complete onComplete() onError(error: Throwable)
  • 27.
  • 28. Основные типы observable: MayBe В отличии от Observable не может вызвать оба метода (как onNext => onComplete) onSuccess(value: T) onComplete() onError(error: Throwable)
  • 29.
  • 30. Обобщённо о наблюдаемых Все наблюдаемые имеют 2 общих состояния - завершенность (complete) и ошибка (error) После обоих состояний мы не можем продолжать обращаться к потоку данных. При этом, если у нас нет слушателя onError, мы получим exception, “не тонко” нам на это намекающий complete (onComplete()/onSuccess(...)) error (onError)
  • 31. Основные типы observer: DefaultObserver class DefaultObserver<T>: Observer<T> Классический Observer, именно его мы и используем через Consumer интерфейс.
  • 32.
  • 33. Основные типы observer: DisposableObserver class DisposableObserver<T>: Observer<T>, Disposable В отличии от DefaultObserver реализовывает так же disposable, и можно отписаться либо внутри него, либо по ссылке извне
  • 34.
  • 35. Основные типы observer: SafeObserver class SafeObserver<T>(observer: Observer<T>): Observer<T>, Disposable Безопасный наблюдатель. Реализовывает в себе обработку всех негативных кейсов, таких как передача null в onNextonError и любых других которые не соответствуют протоколу RxJava2 Принимает в конструктор другого наблюдателя, в который эмитятся данные при условии соответствия протоколу
  • 36.
  • 37. Основные типы observer: SerializedObserver class SerializedObserver<T>(observer: Observer<T>): Observer<T>, Disposable Как и SafeObserver - обёртка, в отличии от остальных наблюдателей может быть вызвана многоразово так как основная цель - упорядочить доступ к основному наблюдателю, путём synchronized блоков и проверок на готовность тех или иных методов.
  • 38.
  • 39. Subjects Представляют как Observable так и Observer функциональность, отличаются поведением. При этом можно подписаться сразу на несколько Observable.
  • 40. Subjects Publish - обновления информации Observer получит с момента подписки. Прошлые эмиты - не получит
  • 41.
  • 42. Subjects Replay - а тут наоборот, всё что было заэмичено - будет отправлено вновь подписавшемуся
  • 43.
  • 44. Subjects Behavior - облегченная версия предыдущего - получит не все заэмиченные, а последний + всё что будет после подписки
  • 45.
  • 46. Subjects Async - в данном случае, обновления получат все участники строго одинаково - последний апдейт + onComplete. (Даже если подписались и после подписки было много эмитов)
  • 47.
  • 48. Операторы Создания Трансформации Фильтрующие Комбинирующие Обработки ошибок Утилитные Условные и булевые Математические и аггрегирующие Соединяющие Конвертирующие
  • 49. Операторы создания Create — создание Observable самостоятельно, используя методы ObservableEmitter самостоятельно From — создание из чего-либо, списка, Callable, Runnable, объекта Just — конвертирует объект или коллекцию объектов в Observable которое моментально эмитит
  • 50.
  • 51. Операторы трансформации FlatMap — трансформирует объекты полученные из Observable с применением функции трансформации к каждому объекту, возвращая в свою очередь новосозданный Observable Map — трансформирует объекты полученные из Observable применяя функцию трансформации к каждому
  • 52.
  • 53. Операторы фильтрации First — возвращает только первый объект полученный из Observable Last — возвращает только последний объект полученный из Observable Take — возвращает N первых объектов полученных из Observable
  • 54.
  • 55. Комбинирующие операторы CombineLatest — когда хотя бы 1 из 2х Observable производит данные - комбинирует его данные с последними данными других Observable и возвращает единый Observable Zip — комбинирует результат нескольких Observable и возвращает единый Observable
  • 56.
  • 57. Операторы обработки ошибок Retry — при получении onError уведомления переподписывается, в надежде на успех
  • 58. Утилитные операторы ObserveOn — определяет планировщик на котором наблюдатель будет наблюдать за наблюдаемым SubscribeOn — определяет планировщик который будет использоваться наблюдаемым для своего выполнения Subscribe — непосредственно подписка на наблюдаемое.
  • 59.
  • 60. Условные и булевые операторы All — определяет все ли объекты произведенные Observable подходят под критерии Contains — определяет произвел ли Observable конкретный объект
  • 61.
  • 62. Mathematical and Aggregate Operators Max — определяет и возвращает максимальный объект произведенный Observable Min — определяет и возвращает минимальный объект произведенный Observable Average — определяет и возвращает среднее значение из объектов произведенных Observable
  • 63.
  • 64.
  • 65.
  • 67.
  • 69.
  • 71.
  • 73.
  • 75.