Course Content
-
Введение в RxJava 3.0. Способы создания Observable В первом модуле вы узнаете чем отличается Observable от Observer и поймете как создать источник данных
-
Основные операторы RxJava 3.0 Рассмотрим на примерах самые популярные операторы RxJava 3.0 такие как map(), flatMap(), filter() и другие.
-
Выходим в сеть с помощью RxJava
Операторы создания Observable: just, fromCallable и другие
В этом уроке мы рассмотрим различные способы создания Observable.
Но для того, чтобы вы могли на практике попробовать примеры показанные в этом уроке, вам необходимо добавить библиотеку RxJava и RxAndroid в свой проект. Для этого есть инструкция в начале урока и краткая инструкция приведена на слайде. Я предполагаю, что вы уже знакомы со средой Android Studio и уже имеете хотя бы небольшой опыт программирования для Android, поэтому надеюсь при добавлении необходимых зависимостей у вас не возникнет проблем, ну а если у вас возникнут вопросы вы всегда можете задать их в комментариях или чате.
Observable.just()
Итак, первый оператор создания источника данных, который мы рассмотрим – это метод just(). Давайте взглянем на пример.

Just() – это статичный метод класса Observable, поэтому, чтобы создать некий источник событий – то есть Observable необходимо вызвать Observable.just().
Метод just() вернет Observable, который будет выдавать данные, которые мы передали в аргументы оператора just. В данном случае – список строк.
Но после создания Observable, для получения данных, необходимо на него подписаться, вызвав метод subscribe и передав в него имплементацию интерфейса Observer.
В данном случае я специально не использую лямбда-выражения, для максимальной наглядности, но в следующих примерах уже не буду так подробно описывать. Как мы уже рассматривали ранее, интерфейс Observer состоит из 4 методов.
Как только мы подпишемся – то вызовется метод onSubscribe(). После этого в методе onNext() по одному будут приходить строки переданные в аргумент just. После последнего переданного аргумента в списке вызовется метод onComplete() – который обозначает что больше значений не ожидается. Результат работы метода вы можете увидеть ниже на скриншоте:

Observable.fromIterable()
Следующим способом создания Observable, мы рассмотрим метод Observable.fromIterable(). В качестве аргумента этот метод принимает коллекции, которые реализуют интерфейс Iterable, например List, Set,Collection и другие.

В этом примере для использования метода fromIterable() сначала создаем список строк и потом передаем экземпляр списка в метод.
После этого необходимо подписаться на созданный источник данных для получения событий в методе onNext. Результат будет такой же, как и в предыдущем примере:

Observable.fromArray()
На первый взгляд, похожим на предыдущий способ создания источника данных, является метод fromArray(). Для использования такого метода нам также необходимо передать список в качестве аргумента, потом не забыть подписаться для получения данных.

Однако, если внимательно посмотреть на результат работы такого метода – станет ясно, что значения переданные в качестве аргумента вернутся не по одному как в предыдущих примерах – где вызвалось несколько методов onNext() – а сразу. То есть, метод onNext() вызовется один раз – и мы сразу же получим весь список целиком. Результат работы оператора fromArray():

Observable.fromCallable()
Следующим способом создания источника событий, то есть Observable – мы рассмотрим метод fromCallable(). Такой метод принимает в качестве аргумента реализацию интерфейса Callable.
Отличительной чертой метода fromCallable() является то, что в отличие от метода just() этот метод имеет отложенное выполнение.То есть, метод System.currentTimeMillis() будет выполнен, только после того, как мы вызовем метод subscribe().
Давайте рассмотрим 2 примера:
Первый пример использования Observable.just(). Сначала создаем Observable c помощью just() и передаем метод, который вычисляет системное время. Далее, ждем 5 секунд и еще раз подписываемся на этот же источник данных. В результате, мы видим, что значение системного времени при второй попытке не изменилось. Все дело в том, что метод just(x) (где x- это какой то метод или лямбда выражение) выполняет этот код сразу же в том потоке в котором мы подписались и больше не выполняется при новой подписке.

Теперь рассмотрим тот же пример, но с использованием оператора Observable.fromCallable(). Первая часть точно такая же, как в предыдущем примере – создаем Observable и подписываемся. После этого ждем 5 секунд и подписываемся снова. В результате, можно заметить, что значения времени отличаются.

Это происходит потому что, fromCallable() имеет эффект отложенного выполнения и выполняется только тогда, когда вызывается метод subscribe().
Надеюсь, теперь, вам ясна разница между двумя этими методами и вы сможете легко объяснить отличия, и избежать потенциальных ошибок, связанных с особенностями работы этих операторов.