Ich versuche folgende Funktion zu entschlüsseln:
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
Ich habe eine gute Einführung in rxjava von http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ erhalten, aber Observer wurde nur beiläufig erwähnt, da Sie den größten Teil des Abonnenten verwenden werden Zeit für Verbrauchsgüter, die von einem Observable ausgegeben werden.
Kann mir jemand erklären
- Was ist ein Beobachter?
- Wie unterscheidet sich ein Beobachter von einem Teilnehmer?
- Was macht das obige Code-Snippet?
Javadoc ließ es wie einen Abonnenten erscheinen. Das Javadoc für Abonnenten gibt an, Beobachter und Abonnement zu implementieren. Ich bin sehr verwirrt.
Antworten:
EDITIERT : mit @ Alrids Kommentar
tl; dr
Ein Abonnent ist also eine Implementierung des Observers mit zusätzlicher Semantik für das Abonnement (es geht mehr um das Aufheben des Abonnements). Der Code in Ihrer Frage zeigt nur, dass er die
Observer
Schnittstelle anstelle der Implementierung (übliche Programmierpraxis) passiert .Auch dieser Code gibt a zurück
Subscription
, was möglicherweise daran liegt, dass der Autor dieses Codes der Meinung war, dass der Client nur Zugriff aufSubscription
Methoden haben sollte, ohne Zugriff auf Elemente, die vom Observable erzeugt werden. Das kann ein Programmiererfehler sein.lange Geschichte
Eigentlich sollten Sie den Inhalt dieser Website (oder dieses Buches) lesen: http://www.introtorx.com Es geht um Rx.Net, aber die Konzepte sind dieselben, sie wurden von Erik Meijer erstellt und RxJava-Implementierer folgten ihnen ( falls zutreffend für die Java-Sprache).
Diese Seite wird Sie interessieren (es ist das zweite Kapitel): KeyTypes
Hier lesen Sie in den ersten Absätzen:
...
Auch wenn Typen / APIs etwas anders sind, werden Sie mit diesem Buch viel lernen, wahrscheinlich viel mehr als mit einigen Blogs.
Was dieses Buch nicht sagt ( ... weil es in der RxJava-Implementierung ist )
Der Hauptentwickler von RxJava führte zu diesem Zeitpunkt eine geringfügige Abweichung ein (siehe PR # 792 ), mit der zwei Arten von Verträgen unterschieden werden konnten:
Observer
Subscription
Diese Änderung ermöglichte es, diese Bedenken der implementierenden Klassen der RxJava-Bibliothek besser auszudrücken / aufzuteilen.
Als Bibliotheksbenutzer sollte es jedoch ausreichend sein, tatsächliche Implementierungen der RxJava-Bibliothek zu verwenden.
Die Implementierung eines Abonnenten erfordert viel mehr Wissen, Arbeit und Sorgfalt. In der Tat ist die Abonnementsemantik abhängig von der Art der beobachtbaren Quelle (heiß oder kalt? Teuer zu erstellen?) Sehr wichtig.
Das Belichten
Subscriber
und nichtObserver
in den oben genannten Fällen beeinträchtigt den Code in den meisten Fällen nicht, ist jedoch nicht für die beabsichtigte Verwendung vorgesehen, es sei denn, diese Semantik für das Nichtabonnieren ist erforderlich. Aber am Ende wird die Implementierung von aSubscriber
und kann dazu führen, dass einige Fallstricke auftreten, wie z.quelle
(Edit: Dies gilt anscheinend nur für RxJava 1.)
An
Observer
ist ein Objekt, das Daten aus einer Datenquelle (anObservable
) abrufen kann . Die Datenquelle überträgt Daten an sie, indem sie den Beobachter anruftonNext()
.A
Subscriber
ist einObserver
, der sich auch von dieser Datenquelle abmelden kann (über dieSubscription
Schnittstelle).Die
getCar()
Funktion versucht, Autos zurückzugeben, aber es gibt keine direkte Methode, um dies zu tun. Es gibt jedoch eine Funktion zum Abrufen von Fahrzeugdetails (getCarDetails()
), mit der ein Beobachter mit allen Fahrzeugdetails aufgerufen wird. Es ruft diese Funktion auf und übergibt sie an einen Beobachter, der beim Abrufen von Daten die Fahrzeugdaten aus den Details abruft und an seinen eigenen Beobachter weiterleitet.quelle
In RxJava 2
org.reactivestreams.Subscriber
befindet sich eine Schnittstelle, die der Spezifikation von Reactive Streams entspricht .Der Hauptunterschied
Observable
besteht darin, dass neuSubscriber
den Gegendruck unterstützt.Observer
ist abonniertObservable
undSubscriber
ist abonniertFlowable
(Geräteorg.reactivestreams.Publisher
).Siehe detaillierte Beschreibung hier .
quelle
Auch in RxJava2 sollten Sie
ResourceObserver
fürObservable
undResourceSubscriber
für verwenden , wenn Sie sich abmelden möchtenFlowable
.Überprüfen Sie diese Frage
quelle