fbpx

Course Content

Total learning: 16 lessons Time: 1 week

Операторы создания Observable: just, fromCallable и другие

В этом уроке мы рассмотрим различные способы создания Observable.

Но для того, чтобы вы могли на практике попробовать примеры показанные в этом уроке, вам необходимо добавить библиотеку RxJava и RxAndroid в свой проект. Для этого есть инструкция в начале урока и краткая инструкция приведена на слайде. Я предполагаю, что вы уже знакомы со средой Android Studio и уже имеете хотя бы небольшой опыт программирования для Android, поэтому надеюсь при добавлении необходимых зависимостей у вас не возникнет проблем, ну а если у вас возникнут вопросы вы всегда можете задать их в комментариях или чате.

Observable.just()

Итак, первый оператор создания источника данных, который мы рассмотрим – это метод just(). Давайте взглянем на пример. 

Пример оператора just()

Just() – это статичный метод класса Observable, поэтому, чтобы создать некий источник событий – то есть Observable необходимо вызвать Observable.just().

Метод just() вернет Observable, который будет выдавать данные, которые мы передали в аргументы оператора just. В данном случае – список строк.

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

В данном случае я специально не использую лямбда-выражения, для максимальной наглядности, но в следующих примерах уже не буду так подробно описывать. Как мы уже рассматривали ранее, интерфейс Observer состоит из 4 методов. 

Как только мы подпишемся – то вызовется метод onSubscribe(). После этого в методе onNext() по одному будут приходить строки переданные в аргумент just. После последнего переданного аргумента в списке вызовется метод onComplete() – который обозначает что больше значений не ожидается. Результат работы метода вы можете увидеть ниже на скриншоте:

Результат работы оператора Observable.just()

Observable.fromIterable()

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

Пример использования оператора Observable.fromIterable()

В этом примере для использования метода fromIterable() сначала создаем список строк и потом передаем экземпляр списка в метод.

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

Результат работы оператора Observable.fromIterable()

 

Observable.fromArray()

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

Пример работы оператора Observable.fromArray()

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

Результат работы оператора Observable.fromArray()

 

Observable.fromCallable()

Следующим способом создания источника событий, то есть Observable – мы рассмотрим метод fromCallable(). Такой метод принимает в качестве аргумента реализацию интерфейса Callable.

Отличительной чертой метода fromCallable() является то, что в отличие от метода just() этот метод имеет отложенное выполнение.То есть, метод System.currentTimeMillis()  будет выполнен, только после того, как мы вызовем метод subscribe().

Давайте рассмотрим 2 примера:

Первый пример использования  Observable.just(). Сначала создаем Observable c помощью just() и передаем метод, который вычисляет системное время. Далее, ждем 5 секунд и еще раз подписываемся на этот же источник данных. В результате, мы видим, что значение системного времени при второй попытке не изменилось. Все дело в том, что метод just(x) (где x- это какой то метод или лямбда выражение) выполняет этот код сразу же в том потоке в котором мы подписались и больше не выполняется при новой подписке. 

Пример работы just(). Время в логе не поменялось

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

Используя метод fromCallable() получаем разные результаты.

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

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