В чем разница между Observable, Completable и Single в RxJava

114

Может ли кто-нибудь объяснить разницу между Observable, Completable и Single в RxJava с четкими примерами?

В каком сценарии мы используем одно по сравнению с другим?

Раджа Джавахар
источник
Вы что-нибудь испытали?
J.
Я только недавно начал .. @ J.Chomel
Raja Jawahar
25
Это совершенно правильный вопрос, и его не следовало закрывать. Хотя rx - отличная библиотека, документация и примеры, к сожалению, крайне скудны и запутаны.
RunLoop

Ответы:

249

Observable- это общий строительный блок ReactiveX источника событий, который генерирует значения с течением времени. (и, следовательно, существует на всех языках, на которые распространяется ReactiveX)
вкратце Наблюдаемые события:
onNext * (onCompleted | onError)? / (* ноль или больше? - ноль или 1)

Singleи Completableпредставляют собой новые типы, представленные исключительно в RxJava, которые представляют сокращенные типы Observable, которые имеют более сжатый API.

Singleпредставляют, Observableчто испускают единственное значение или ошибку.

Completableпредставляют , Observableчто излучает никакой ценности, но только терминальные события, либо onErrorилиonCompleted

Вы можете думать о различиях, как о различиях метода, который возвращает:

  • Коллекция объектов - наблюдаемые

  • Один объект - Single

  • и метод, который не возвращает значений (метод void) - Completable.

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

Completableуместно, когда у вас есть Observableи вас не волнует значение, полученное в результате операции, или его нет. Примеры: обновление кеша, например, операция может быть успешной / неудачной, но нет значения.
Другой пример - длительная операция инициализации, которая ничего не возвращает. Это может быть сетевой вызов UPDATE / PUT, который привел только к индикации успеха.

В любом случае Completable и Single не добавляют новых возможностей, но они вводят более надежные и лаконичные API, которые больше рассказывают об операциях, лежащих в основе Observable, которые предоставляет API.

Редактировать:

RxJava2 Maybe:

RxJava2 добавлен новый тип , который называется Maybe, Maybeэто сочетание Completableи Single.

На том же языке, что и выше, Maybeего можно рассматривать как метод, возвращающий Optionalнекоторый тип, Optionalэто оболочка вокруг объекта, которая явно сообщает, есть ли у нас какое-то значение в нем - Objectили нет (вместо null).
С помощью Maybeмы можем либо иметь какое-то значение точно так же, Singleлибо ничего не возвращать - точно так же Completable. Вдобавок, как и у обоих, у нас есть ошибка.
Maybeценно, когда мы хотим отметить, что объект Observableможет не иметь значения и просто завершится.
Пример будет извлечен из кеша, у нас не обязательно будет значение в кеше, поэтому в этом случае мы завершим, как только мы получим onNextзначение из кеша.
Это также достойно обработки ненулевых значений в потоке с помощью RxJava2.

RxJava2 Flowable:

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

Йосриз
источник
2
А как насчет текучести?
Нирадж Чаухан
Так что, если я пишу на Котлине, по Maybe<T>сути Single<T?>,?
AAverin
Можете ли вы считать Singleэто Completableс возвращаемым значением?
Eido95
14
  1. Flowable и Observable могут представлять конечные или бесконечные потоки. Текучая поддержка противодавления .
  2. Single - это потоки с одним элементом.
  3. Возможно, это потоки с 0 или одним элементом.
  4. Наконец, Completable представляет поток без элементов, т.е. он может завершиться только без значения или завершиться ошибкой.

Краткий ответ я нашел здесь в разделе RXJava.

Чарит Де Сильва
источник