Jaka jest różnica między Observable, Completable i Single w RxJava

113

Czy ktoś mógłby wyjaśnić różnicę między Observable, Completable i Single w RxJava z jasnymi przykładami?

W którym scenariuszu używamy jednego nad innymi?

Raja Jawahar
źródło
Czy coś przeżyłeś?
J. Chomel
Niedawno zacząłem .. @ J.Chomel
Raja Jawahar
25
To jest całkowicie uzasadnione pytanie i nie powinno być zamykane. Chociaż rx to świetna biblioteka, dokumentacja i przykłady są niestety bardzo ubogie i zagmatwane.
RunLoop

Odpowiedzi:

248

Observablejest ogólnym blokiem konstrukcyjnym ReactiveX źródła zdarzeń, które emituje wartości w czasie. (i dlatego istnieje w każdym języku, do którego rozszerzono ReactiveX)
w skrócie Zdarzenia obserwowalne to:
onNext * (onCompleted | onError)? / (* zero lub więcej? - zero lub 1)

Singlei Completablesą nowymi typami wprowadzonymi wyłącznie w RxJava, które reprezentują zredukowane typy Observable, które mają bardziej zwięzłe API.

Singlereprezentują, Observableże emitują pojedynczą wartość lub błąd.

Completablereprezentują, Observableże nie emituje żadnej wartości, a jedynie zdarzenia końcowe, albo onErrorlubonCompleted

Możesz myśleć o różnicach, takich jak różnice w zwracanej metodzie:

  • Zbiór obiektów - obserwowalny

  • Pojedynczy obiekt - pojedynczy

  • i metoda, która nie zwraca żadnych wartości (metoda void) - Completable.

Singlemoże być odpowiednie, gdy masz Observable zorientowane na zadania i oczekujesz pojedynczej wartości, takiej jak żądanie sieciowe, które jest wykonywane raz i zwraca wartość (lub błąd), połączenie sieciowe jest obsługiwane jednorazowo, co oznacza, że ​​nie oczekujesz, że zwróci dodatkowe wartości z biegiem czasu. Innym przykładem jest operacja pobierania danych z bazy danych.

Completablejest odpowiedni, gdy masz Observablei nie dbasz o wartość wynikającą z operacji lub nie ma żadnej. Przykładami są na przykład aktualizowanie pamięci podręcznej, operacja może się powieść / zakończyć, ale nie ma wartości.
Innym przykładem jest długa operacja init, która nic nie zwraca. Może to być wywołanie sieciowe UPDATE / PUT, które zakończyło się tylko wskazaniem sukcesu.

W każdym razie Completable i Single nie dodają nowych możliwości, ale wprowadzają bardziej niezawodne i zwięzłe interfejsy API, które mówią więcej o operacjach za Observable, które ujawnił interfejs API.

Edytować:

RxJava2 Maybe:

RxJava2 dodał nowy typ o nazwie Maybe, Maybejest połączeniem Completablei Single.

W tym samym języku, co powyżej, Maybemoże być traktowany jako metoda zwracająca Optionalpewien typ, Optionaljest opakowaniem wokół Object, które wyraźnie mówi, czy mamy w nim jakąś wartość - Objectczy nie (zamiast null).
Z Maybemożemy albo mieć jakąś wartość dokładnie taką, jak Singlelub nic nie zwracać - tak jak Completable. Dodatkowo, podobnie jak obaj, mamy błąd.
Maybejest cenny, gdy chcemy zaznaczyć, że Observablemoże nie mieć wartości i po prostu się zakończy.
Przykład zostanie pobrany z pamięci podręcznej, niekoniecznie będziemy mieć wartość w pamięci podręcznej, więc w tym przypadku zakończymy, a więc otrzymamy onNextwartość z pamięci podręcznej.
Jest to również warte obsługi wartości innych niż null w strumieniu z RxJava2.

RxJava2 Flowable:

Najpierw zdefiniujmy przeciwciśnienie. Przeciwciśnienie jest sposobem radzenia sobie z sytuacją, w której dane są generowane szybciej, niż można je przetworzyć. Flowableposiada wsparcie dla przeciwciśnienia, umożliwiające dalszy przepływ zamówień. Możesz przeczytać więcej o różnicach tutaj .

yosriz
źródło
2
A co z płynnym?
Niraj Chauhan
Więc jeśli piszę w Kotlinie, to Maybe<T>w zasadzie Single<T?>?
AAverin
Czy możesz uznać, Singleże jest to Completablezwracana wartość?
Eido95,
13
  1. Flowable i Observable mogą reprezentować skończone lub nieskończone strumienie. Płynny wsparcie ciśnienie wsteczne .
  2. Pojedyncze to strumienie z jednym elementem.
  3. Może to strumienie zawierające 0 lub jeden element.
  4. Wreszcie Completable reprezentuje strumień bez elementów, tj. Może zakończyć się tylko bez wartości lub zawieść.

Zwięzłą odpowiedź znalazłem tutaj w dziale RXJava.

Charith De Silva
źródło