Pull to refresh

Посмотрим на rx.Single в RxJava?

Reading time 2 min
Views 6.3K
Всем добрый день! А может у кого-то и не день, но главное, чтобы был добрый. В этой статье я собираюсь рассказать совсем чуть-чуть про такой класс в RxJava, как Single.

А чем Single отличается от Observable ?


Конечно, у него нет всех методов, которые есть у Observable. Subscriber у Single также отличается тем, что содержит только два метода, а не три. Думаю, что все отличия в плане реализации вы сможете найти в документации.

Возникает вопрос:
чем вызваны такие изменения ?

Ответ тут очевиден: Single (что можно даже и из названия понять) содержит только один элемент, в отличии от Observable.

Кто-то подумает и скажет
пффф, ну и что? А я буду использовать всегда Obsevable, пусть в нем будет только один элемент.

По-моему мнению, в этом ничего страшного нет, но есть ли какие-то минусы от такого использования?

  • Если вы знаете, что вы будете работать только с одним элементом, то в использовании Observable нет нужды или, как говорят, overkill;
  • Также нужно понимать, что Observable более тяжеловесный, чем Single (а поговаривают, что Single даже быстрее);

Говоришь Single, хм...


В single возможны две ситуации:

  • одно значение
  • exception

Тут важно понимать, чего вы пытаетесь добиться, или какая ваша политика? Если вы считаете, что пустой результат для вас это нормально, то, скорее всего, Single вам не подойдет, но если это не так, и вы знаете, что результат обязательно должен быть, то Single это то, что вам надо. Кстати, стоит отметить, что у Single нет метода empty(). Это я на всякий случай решил сообщить.

Да покажи наконец как использовать этот Single!


Обычный пример из жизни. Предположим, что у нас микросервисная архитектура (обожаю микросервисы).

Входные данные: у нас есть три микросервиса A,B,C.
A — orchestration service.
Задача: сделать запрос в сервис B и в C из микросервиса A и сагрегировать данные.

Ответ: конечно, можно сделать запрос в микросервис B, а потом в микросервис C и потом сагрегировать данные в микросервисе A, но тогда приходится ждать результаты из одного микросервиса, а потом с другого. Ух, как же это долго!

Но вспоминаем, что у нас есть rx.Single, ураа!

        Single<String> b = Single.fromCallable(() -> serviceA.getResponse())
                                              .subscribeOn(Schedulers.io());
        Single<String> c = Single.fromCallable(() -> serviceB.getResponse())
                                              .subscribeOn(Schedulers.io());
        Single.zip(b, c, (resultA, resultB) -> resultA + resultB);

И вот оно!
А что именно ?

Запрос в микросервис B и запрос в микросервис С происходят независимо друг от друга, а микросервис A просто ждет результатов.

Интересненько


Вот ссылка на документацию. Очень хорошая документация. Можно найти много чего полезного. Ну и книгу могу посоветовать: «Reactive Programming with RxJava».
Tags:
Hubs:
0
Comments 0
Comments Leave a comment

Articles