Что есть Реактивное программирование?

Введение

Уверен, что многим из нас приходилось выполнять асинхронные задачи(сетевые запросы, тяжелые вычисления и т.д.), которые должны быть выполнены вне основного потока(aka MainThread or UIThread). Это можно сделать используя Handler-ы, AsyncTask-и. Но, именно фреймворк Rx(Reactive Extensions) дает нам огромный инструментарий(Observable-Observer, операторы) для реализации этих задач красиво и эффективно, используя мощь функционального программирования.

Базовыми строительными блоками реактивного кода являются Observable и Observer. Observable источником данных, а Observer — потребителем. Observable эмитит или, так сказать излучает данные.

Фреймворк RxJava является модифицированной реализацией паттерна Наблюдатель. Но есть одно важное отличие: Observable не начинает порождать данные до тех пор, пока Observer явно не подписывается на него.

Так как мы будем рассматривать фреймворк Rx в контексте Android, то мы будем использовать реализацию для Java и Kotlin. RxJava и RxKotlin, соответсвенно. Бывают еще RxSwift, RxPy и для многих других языков.  

RxJava позволяет использовать парадигму функционального реактивного программирования (FRP) в Android. Понять, что это значит, весьма непросто, поэтому требуется немало пояснений. Во-первых, слово функциональное означает то, что в FRP основным понятием являются функции и в этом эта парадигма схожа с обычным функциональным программированием. Конечно, в Android весьма затруднительно использовать полноценное функциональное программирование, но все же с помощью RxJava мы смещаем приоритет от объектов к функциям. Во-вторых, реактивное программирование означает программирование с асинхронными потоками данных, то о чем мы говорили выше(работа с сетью, БД, сложные вычисления). 

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

В качестве основных преимуществ RxJava выделяются следующие:

  • Реализация в виде паттерна Наблюдатель избавляет нас от необходимости создавать свои реализации его в коде и априори избавляет от такой головной боли как Callback hell.
  • Обеспечение многопоточности. RxJava позволяет гибко управлять асинхронностью выполнения запросов, а также переключать выполнение операций в различные потоки. Кроме того, что немаловажно для Android, RxJava также позволяет легко обрабатывать результат в главном потоке(MainThread) приложения.
  • Управление потоками данных. Это позволяет преобразовывать данные в потоке, применять операции к данным в потоке (к примеру, сохранять их данные из потока в базу), объединять несколько потоков в один, изменять поток в зависимости от результата другого и многое другое.
  • Обработка ошибок. Это еще одно очень важное преимущество RxJava, которое позволяет обрабатывать различные ошибки, возникающее в потоке, повторять серверные запросы в случае ошибки и передавать ошибки подписчикам.