Próbuję rozszyfrować następującą funkcję:
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
Mam dobre wprowadzenie do rxjavy z http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/, ale wspomniałem tylko na marginesie o Observer, mówiąc, że będziesz używać subskrybenta przez większość czas do pozycji konsumenckich wyemitowanych z Obserwowalnego.
Czy ktoś może mi wyjaśnić
- Kim jest obserwator?
- Czym różni się obserwator od subskrybenta?
- Co robi powyższy fragment kodu?
Javadoc sprawiał, że wyglądał jak subskrybent. Javadoc dla subskrybenta twierdzi, że implementuje obserwatora i subskrypcję. Jestem zdezorientowany.
Odpowiedzi:
EDYTOWANE : z komentarzem @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Czyli abonent jest implementacją obserwatora , z dodatkową semantyką przy subskrypcji (chodzi bardziej o anulowanie subskrypcji). Kod w twoim pytaniu pokazuje tylko, że przechodzi przez
Observer
interfejs, a nie implementację (zwykła praktyka programowania).Również ten kod zwraca a
Subscription
, może to być spowodowane tym, że autor tego kodu uważał, że klient powinien mieć dostęp tylko doSubscription
metod, bez dostępu do elementów wytwarzanych przez to, co obserwowalne. To może być błąd programisty.długa historia
Naprawdę powinieneś przeczytać zawartość tej strony (lub książki): http://www.introtorx.com Chodzi o Rx.Net, ale koncepcje są takie same, zostały stworzone przez Erika Meijera, a realizatorzy RxJava podążali za nimi ( jeśli dotyczy języka Java).
Ta strona Cię zaciekawi (jest to rozdział drugi): Typy klawiszy
Tutaj przeczytasz w pierwszych akapitach:
...
Nawet jeśli typy / API są nieco inne, wiele się nauczysz dzięki tej książce, prawdopodobnie o wiele więcej niż w przypadku niektórych blogów.
Czego ta książka nie mówi ( ... ponieważ jest w implementacji RxJava )
Główny programista RxJava w tym czasie wprowadził niewielką zmianę (patrz PR # 792 ), która pozwoliła wyróżnić dwa rodzaje umów:
Observer
Subscription
Ta zmiana pozwoliła lepiej wyrazić / podzielić te obawy dotyczące klas implementujących biblioteki RxJava.
Jednak jako użytkownik biblioteki korzystanie z rzeczywistych implementacji biblioteki RxJava powinno wystarczyć.
Wdrożenie abonenta wymaga znacznie więcej wiedzy, pracy i staranności, w istocie semantyka subskrypcji jest bardzo ważna w zależności od rodzaju obserwowalnego źródła (gorące czy zimne? Drogie w tworzeniu?)
Ujawnianie
Subscriber
raczej niżObserver
w przypadkach takich jak powyżej nie będzie kolidować z kodem w większości przypadków, ale nie jest to jego zamierzone użycie, chyba że te semantyki bez subskrypcji są potrzebne. Ale ostatecznie wdrożenieSubscriber
a może wiązać się z wpadnięciem w pewne pułapki, takie jak:źródło
(Edycja: najwyraźniej dotyczy to tylko RxJava 1.)
Jest
Observer
to obiekt, który może pobierać dane ze źródła danych (anObservable
). Źródło danych wypycha dane do niego, wywołując dane obserwatoraonNext()
.A
Subscriber
to,Observer
który może również wypisać się z tego źródła danych (przezSubscription
interfejs).getCar()
Funkcja próbuje powrócić samochody, ale nie ma bezpośredni sposób to zrobić. Istnieje jednak funkcja, która pobiera szczegóły samochodu (getCarDetails()
), która wywoła obserwatora ze wszystkimi szczegółami samochodu. Dlatego wywołuje tę funkcję i przekazuje ją jako obserwatorowi, który po otrzymaniu danych pobierze dane samochodu ze szczegółów i przekaże je własnemu obserwatorowi.źródło
W RxJava 2
org.reactivestreams.Subscriber
jest interfejs zgodny ze specyfikacją Reactive Streams .Główną różnicą
Observable
jest to, że noweSubscriber
podpory przeciwciśnienia.Observer
jest subskrybowanyObservable
iSubscriber
subskrybowanyFlowable
(implementujeorg.reactivestreams.Publisher
).Zobacz szczegółowy opis tutaj .
źródło
Również w RxJava2 , jeśli chcesz mieć możliwość anulowania subskrypcji, powinieneś użyć
ResourceObserver
forObservable
iResourceSubscriber
forFlowable
.Sprawdź to pytanie
źródło