@lacredin
Программист

В чём основная концепция использования RxJava?

Изучая RXJava я с толкнулся с трудностью в понимании того, как было задумано его использование.
При первом знакомстве у меня сложилось мнение, о том, что это реализация патерна "Слушатель" с полезными фичами. То есть, есть объект, который генерирует события, а подписанные на объект слушатели эти события получают, при этом объект генерирующий события может существовать от начала работы приложения до самого конца.
Но потом заметил, что во всех примерах использования библиотеки, всегда есть готовый набор данных, который передаётся Observable при его создании(за исключением случаев, где Observable должен генерировать события в повторяющихся промежутках времени) и никогда не дополняется и не заменяется для существующего Observable.

Отсюда у меня сложилось впечатление, что Observable надо воспринимать, как одноразовый объект.
То есть, у нас есть набор данных, мы создаём Observable с этим набором и он существует пока набор не устареет, как только набор устарел, мы отписываем всех подписчиков нашего Observable и создаём новый Observable с новым набором данных, на который подписываются слушатели заново.

Некоторые статьи рассказывают о том, что можно с помощью RXJava следить за набором данных на клавиатуре, примеры они конечно же не приводят, но я нашёл вот такой пример:
https://github.com/shekhargulati/rxjava-examples/b...
Здесь используется "вечный" цикл для отслеживания нажатий на клавиатуре и мне кажется это не лучший способ траты ресурсов устройства.

Растолкуйте мне пожалуйста, как же предполагается использовать RXJava?

P.S. В своём android проекте я хотел создать Observable в сервисе, который занимается некоторой работой с сетью и подписывать на него activitys/fragments, что бы они реагировали на изменения извне. Однако, если Observable придётся на каждый запрос пересоздавать, то возникает необходимость постоянно переподписывать слушателей, что не очень удобно, хотя и возможно.
  • Вопрос задан
  • 2237 просмотров
Решения вопроса 1
@red-barbarian
RxJava - это библиотека для реализации реактивного стиля в java
реактивный стиль вещь похожая на более известный функциональный стиль программирования.
выражается он в следующем
есть поток данных, мы применяем к нему некие преобразования и получаем новый поток.
например
(поток запросов в сеть в виде адресов страниц)-> операторЗапросаВСеть -> ОператорПарсинга-> ОператорФормированияДатаОбъектов ->(отображение на экране)
Популярность в андроиде, думаю, приобрел за счет простоты работы с многопоточностью. По крайней мере первые примеры применения в андроиде rx обычно про это.)
вообще, это немного другой способ мышления. отличный от процедурного и ооп.
есть источник, есть получатель и много преобразований.
источник это observable, получатель это subscriber/observer . преобразования это разного рода операторы или их цепочки.
В этом случае мы понимаем приложение как нити потоков данных. такая схема бывает проще чем схема из объектов. иногда.
конечно, мы можем применять и гибриды из этих парадигм.
вообще, это стоит попробовать. возможно она очень вам близка по стилю вашего мышления.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Концепция Rx заключается в основном в том, что существуют потоки данных внутри приложения. Эти потоки где-то начинаются (create) и где-то заканчиваются(subscribe).

Про наборы данных - не знаю, скорее нет. Например, может быть бесконечный Observable, следящий за БД. Когда вы к нему подписываетесь, он эмитит текущее состояние БД, когда оно изменяется - эмитит ещё. Переподписка для этого не нужна.

То, что вы говорите про Observable, на который вы подписываетесь и работа идёт вне зависимости от этой подписки, это называется "горячий" Observable. Это можно сделать, но немного непонятно, зачем именно для сети нужно такое поведение. Зачем нужен выполняющийся запрос, если на его результат, возможно, никто больше не подпишется? В такой ситуации полезнее "холодный" Observable, который начинает запрос при подписке и отменяет его при отписке.

Далее, насчёт ввода с клавиатуры. Смотрите RxAndroid, и, в частности, RxTextView. В этом случае абсолютно то же самое - пока никто не слушает, следить за клавиатурой не нужно. Когда появился подписчик - начинаем слушать. И в случае именно андроида нет возможности установить несколько листенеров на одну вьюху, потому не удивляйтесь, когда дважды вызвав RxView.clicks(button).subscribe(Log::d) на одной кнопке, обнаружите, что эмиттит только второй Observable, а первый замолчал навсегда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы