Рис. 1 – Пример реализации TCP-соединения.
В приведенном коде connect() - создает java.net.Socket и подключается к серверу, sendBytes() пишет в output-поток сокета, readAnswer() читает из input-потока сокета.Данный код имеет ряд недостатков, а именно: блокировка записи/чтения, неудобная обработка ошибок и т.д.. Эти и другие проблемы можно решить при помощи RxJava.
RxJava - это библиотека, базирующаяся на технологии ReactiveX (Rx) с открытым исходным кодом, которая изначально разрабатывалась компанией Netflix. Она позволяет быстро и без затруднений писать реактивный код.
Приведенный выше код, написанный с использованием RxJava будет выглядеть как показано на рис. 2.
Рис. 2 – Пример TCP-соединения с использованием RxJava. Отличие данного кода заключаются в том, что теперь метод send() возвращает Observable, а не String. Т.е. в результате мы получаем поток с данными, на который нам нужно подписаться при помощи Subscribe и в нем указать, что нужно делать с данными и ошибками.Для обработки ошибок в RxJava предусмотрены операторы: doOnError(), onErrorReturn(), onErrorResumeNext(), onExceptionResumeNext(), данные операторы собирают ошибки, которые возникают во время выполнения операторов и передают их в обработчик исключений в subscribe(). Оператор retry() повторяет попытку обработки данных n-е количество раз во время получения ошибки. Добавив данные операторы, получаем следующий (рис. 3).
Рис. 3. – Код TCP-соединения с добавлением операторов для обработок ошибок.
Для вынесения выполнения данной задачи в отдельный поток существуют операторы: observeOn() и subscribeOn(). subscribeOn()- переносит выполнение всех операторов, которые указаны выше него, в указанный поток. observeOn() - переносит выполнение операторов, находящихся ниже него, в указанный поток. Комбинирование данных операторов позволяет легко и быстро переключаться между разными потоками (рис. 4).Рис. 4 - Код TCP-соединения с добавлением операторов для переключения между потоками.
Подводя итог можно сделать вывод, что использование Rx в разработке повышает устойчивость работы программы к багам и непредвиденным ошибкам, код становится более читаемым, гибким и имеет высокие возможности для расширения.
Реактивный подход - это другой подход к программированию, по сравнению с традиционным подходом. Использование потоков данных и функциональных операторов с возможностями ООП дают широкие возможности на этапе разработки.
Список литературы
Introduction to Rx / Lee Campbell. - 2012.-354c.
Официальный сайт ReactiveX: портал [Электронный ресурс] . -Режим доступа: http://reactivex.io/ свободный. – Загл. с экрана.
Манифест реактивного программирования: портал [Электронный ресурс] . -Режим доступа: http://www.reactivemanifesto.org/ свободный. – Загл. с экрана.
Маркин Е.И. мобильная разработка для абитуриентов / Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов // Сборник статей VI международной НПК “Наука и образование: сохраняя прошлое, создаём будущее”. Пенза: "Наука и Просвещение" . 2016. С. 30-32.
Маркин Е.И. Технология реактивного программирования / Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов // Cборник статей победителей IV международной НПК “Инновационные научные исследования: теория, методология, практика” . Пенза: "Наука и Просвещение". 2016. С. 44-47.
Маркин Е.И. Использование технологии реактивного программирования при работе с геолокацией. /Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов// Cборник статей победителей VI Международной НПК “WORLD SCIENCE: PROBLEMS AND INNOVATIONS”. Пенза: "Наука и Просвещение". 2016. С. 86-89.