Реактивное программирование. Изучаем RxJava. Часть 1.

RxJava. О фреймворке твердят буквально везде. Работодатели, видя в резюме кандидатов это новомодное название, тут же добавляют плюс в карму. Но что действительно на практике из себя представляет реактивное программирование в общем и RxJava в частности? В этой серии уроков мы разберем основы использования данного фреймворка применительно к разработке для платформы Android.

Говорят, что после нескольких лет разработки в императивном стиле, используя традиционные языки программирования, начать думать в реактивно-функциональном стиле непросто. На самом деле я думаю, что это не совсем так. Если хорошенько разобраться в вопросе, то переход от одного стиля программирования к другому не столь болезненный. Если вы конечно не совсем закостенелый сторонник исключительно старых добрых императивных традиций и совсем не желаете учиться.

Подробнее о функциональном программировании мы поговорим в отдельных статьях, а сейчас перейдем к описанию основной идеологии RxJava.

Итак, по факту RxJava не что иное как «Паттерн Observer на стероидах». Если вы не знали до этого или забыли, что из себя представляет данный паттерн, рекомендую обратиться к этой статье.

В RxJava также есть наблюдаемый объект Observable, как некий источник данных. И есть объекты-наблюдатели или, по-другому, подписчики(Subscriber). Observable может отдавать свои данные подписчикам, но только в том случае, если на него кто-то подписан.

Сразу перейдем к примеру. Для создания объекта Observable можно воспользоваться следующим кодом:

На первый взгляд может показаться несколько сложно. Но давайте посмотрим на код повнимательнее. В методе call() мы фактически генерируем данные для подписчика. Эти данные являются обычными строками, представляющие набор имен. После этого мы вызываем метод onCompleted() свидетельствующий о том, что данных больше нет.

У объекта Observable сейчас нет ни одного подписчика, и ему некому отдавать свои данные. Давайте создадим наблюдателя — объект Subscriber, который подпишется на Observable, получит от него данные и что-нибудь с ними сделает, например, напечатает их на экран:

Subscriber содержит в себе три метода с говорящими названиями. Нас сейчас интересует метод для получения следующего фрагмента данных — onNext(). В нем мы записываем каждую полученную строку в лог.

И наконец, последнее, что нам нужно — это подписаться на Observable:

В итоге получим следующий результат:

rxjava

Но на самом деле наш код получился довольно громоздким. Все, что мы написали выше, можно было сократить. Например, создать Observable из массива, используя метод from(String[] s):

Также мы можем упростить наш Subscriber. Допустим, нас не интересуют методы onError() и onComplete(). Для этого мы можем реализовать интерфейс Action1, в котором описать только те действия, которые нужно будет выполнять при вызове метода onNext():

Теперь просто передадим его в качестве одного из параметров в методе subscribe() при подписке на Observable:

В итоге весь пример можно переписать следующим образом:

Выводы.

Итак, в чем же итоговое преимущество использования именно этого фреймворка? Дело в том, что RxJava действительно может многое. В роли источника данных (Observable) может выступать сетевой запрос, локальная БД или какой-то поток байтов, а подписавшись на обновление этих данных (создав Subscriber’a) вы можете обновлять пользовательский интерфейс и реагировать на нажатия кнопок на экране. При этом можно даже выполнять дополнительно фильтрацию поступающих данных, отсеивая ненужные и ошибочные данные. То, как именно, вы будете использовать возможности RxJava — дело за вами.

На этом первая часть нашего изучения RxJava подошла к концу. В следующей статье мы поговорим о вспомогательных операторах RxJava, позволяющие выполнять преобразование данных перед получением их подписчиком, например, выполнять фильтрацию данных или изменять их представление.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *