Яка різниця між спостережуваним, складним та одинарним у RxJava


113

Чи можете будь-хто пояснити, будь ласка, різницю між спостережуваним, складним та одиночним в RxJava чіткими прикладами?

У якому сценарії ми використовуємо один над іншими?


Ви щось переживали?
J. Chomel

Я нещодавно почав .. @ J.Chomel
Раджа Джавахар

25
Це цілком справедливе питання, і його не слід було закривати. Хоча rx - чудова бібліотека, документація та приклади, на жаль, надзвичайно бідні та заплутані.
RunLoop

Відповіді:


247

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

Singleі Completableце нові типи, введені виключно на RxJava, які представляють зменшені типи Observable, які мають більш стислий API.

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

Completableпредставляють, Observableщо не випускає значення, а лише кінцеві події, onErrorабоonCompleted

Ви можете думати про відмінності, як про відмінності методу, який повертається:

  • Колекція об'єктів - спостережувана

  • Одиничний об’єкт - Одинарний

  • і метод, який не повертає значень (метод void) - Завершений.

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

Completableпідходить, коли у вас є Observableі вам не байдуже значення, отримане в результаті операції, або його немає. Наприклад, оновлення кеша, наприклад, операція може бути успішною / невдалою, але значення немає.
Інший приклад - деяка тривала операція init, яка нічого не повертає. Це може бути UPDATE / PUT мережевий дзвінок, який спричинив лише показник успіху.

У будь-якому випадку, Completable і Single не додають нових можливостей, але вони впроваджують більш надійні та стислі API, що розповідає більше про операції, що стоять за спостережуваним, що піддається API.

Редагувати:

RxJava2 Maybe:

RxJava2 додав новий тип, який називається Maybe, Maybeє комбінацією Completableта Single.

Цією ж мовою, як і вище, Maybeможе розглядатися як метод, який повертає Optionalпевний тип, Optional- це обгортка навколо Об'єкта, яка явно повідомляє, чи є у нас якесь значення - Objectчи ні (замість нуля).
З Maybeми можемо або мати якесь - то значення в точності , як Singleі немає повернення нічого - так само , як Completable. Крім того, як і обидва, ми маємо помилку.
Maybeє цінним, коли ми хочемо відзначити, що потенціал Observableможе не мати значення і просто завершиться.
Приклад може бути отриманий з кеша, ми не обов’язково матимемо значення в кеші, тому в цьому випадку ми завершимо, onNextоскільки отримаємо зі значенням з кеша.
Це також гідно для обробки ненульових значень у потоці з RxJava2.

RxJava2 Flowable:

Спочатку визначимося з тиском. Зворотний тиск - це засіб вирішення ситуації, коли дані генеруються швидше, ніж вони можуть бути оброблені. Flowableмає підтримку зворотного тиску, що дозволяє запитувати предмети. Детальніше про відмінності ви можете прочитати тут .


2
А що з плавним?
Niraj Chauhan

Так що, якщо я пишу в Котлін, це Maybe<T>, по суті, так Single<T?>?
ААверин

Чи можете ви вважати Singleсебе Completableповернутим значенням?
Eido95

13
  1. Тече і спостерігається може представляти кінцеві або нескінченні потоки. Текучий підтримка зворотного тиску .
  2. Одиничні - це потоки з одним елементом.
  3. Можливо, це потоки з 0 або одним елементом.
  4. Нарешті, Completable являє собою потік без елементів, тобто він може завершуватися лише без значення або відмови.

Коротку відповідь я знайшов тут, у розділі RXJava.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.