Ich bekomme keinen Grund, RxJava in Android und LiveData von Android Architectural Components zu verwenden. Es wäre sehr hilfreich, wenn die Anwendungsfälle und Unterschiede zwischen beiden zusammen mit einem Beispielbeispiel in Form von Code erläutert würden, der die Unterschiede zwischen beiden erklärt.
185
Antworten:
Android LiveData ist eine Variante des ursprünglichen Beobachtermusters mit zusätzlichen aktiven / inaktiven Übergängen. Als solches ist es in seinem Umfang sehr restriktiv.
Anhand des in Android LiveData beschriebenen Beispiels wird eine Klasse erstellt, um Standortdaten zu überwachen und die Registrierung basierend auf dem Anwendungsstatus zu registrieren und die Registrierung aufzuheben .
RxJava bietet Operatoren, die viel allgemeiner sind. Nehmen wir an, dass dieses Observable Standortdaten liefert:
Die Implementierung des Observable kann mithilfe
Observable.create()
der Abbildung der Rückrufoperationen aufgebaut werden. Wenn das Observable abonniert ist, wird der Rückruf registriert, und wenn es abgemeldet ist, wird der Rückruf nicht registriert. Die Implementierung sieht dem im Beispiel bereitgestellten Code sehr ähnlich.Nehmen wir außerdem an, dass Sie ein Observable haben, das true ausgibt, wenn die Anwendung aktiv ist:
Anschließend können Sie alle Funktionen von LiveData wie folgt bereitstellen
Der
switchMap()
Bediener gibt entweder den aktuellen Standort als Stream an oder nichts, wenn die Anwendung nicht aktiv ist. Sobald Sie dasliveLocation
Observable haben, können Sie mit RxJava-Operatoren viele Dinge damit tun. Mein Lieblingsbeispiel ist:Dadurch wird die Aktion nur ausgeführt, wenn sich der Standort geändert hat und der Standort interessant ist. Sie können ähnliche Operationen erstellen, die Zeitoperatoren kombinieren, um die Geschwindigkeit zu bestimmen. Noch wichtiger ist, dass Sie mithilfe von RxJava-Operatoren detailliert steuern können, ob Vorgänge im Hauptthread, im Hintergrundthread oder in mehreren Threads ausgeführt werden.
Der Punkt von RxJava ist, dass es Steuerung und Timing in einem einzigen Universum kombiniert, indem Operationen verwendet werden, die aus der Bibliothek bereitgestellt werden, oder sogar benutzerdefinierte Operationen, die Sie bereitstellen.
LiveData adressiert nur einen kleinen Teil dieses Universums, was dem Aufbau des Universums entspricht
liveLocation
.quelle
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
Ist der LiveData-Lebenszyklus jedoch nicht bekannt? Wenn wir Rx verwenden würden, müssten wir dann nicht die Änderungen des Lebenszyklus bewältigen?In Bezug auf die ursprüngliche Frage ergänzen sich sowohl RxJava als auch LiveData sehr gut.
LiveData
glänzt auf der ViewModel-Ebene mit ihrer engen Integration in Android-Lebenszyklen undViewModel
.RxJava
bietet mehr Funktionen bei Transformationen (wie von @Bob Dalgleish erwähnt).Derzeit verwenden wir
RxJava
Datenquellen- und Repository-Ebenen und sieLiveData
werdenLiveDataReactiveStreams
in ViewModels in (using ) umgewandelt (bevor Daten Aktivitäten / Fragmenten ausgesetzt werden) - sehr zufrieden mit diesem Ansatz.quelle
observeOn
,LiveDataReactiveStreams
geht das sowieso durch den AufrufLiveData.postValue()
. Und es gibt keine Garantie dafür, dass IhrsubscribeOn
Wille generell Auswirkungen hat.Es gibt viele Unterschiede zwischen LiveData und RxJava:
quelle
onCleared
.Tatsächlich
LiveData
handelt es sich nicht um ein wesentlich anderes Tool als dasRxJava
, weshalb es als Architekturkomponente eingeführt wurde, wennRxJava
der Lebenszyklus leicht hätte verwaltet werden können, indem alle Abonnements für Observable in einemCompositeDispoable
Objekt gespeichert und dann inonDestroy()
dasActivity
oderonDestroyView()
desFragment
nur eines verwendet wurden Codezeile?Ich habe diese Frage vollständig beantwortet, indem ich eine Filmsuch-App einmal mit RxJava und dann mit LiveData hier erstellt habe .
Kurz gesagt, ja, das könnte es, aber dafür müssten zunächst die relevanten Lebenszyklusmethoden außer dem grundlegenden Lebenszykluswissen außer Kraft gesetzt werden. Dies mag für einige immer noch keinen Sinn ergeben, aber die Tatsache ist, dass nach einem der Jetpack-Sitzungen in Google I / O 2018 viele Entwickler den Lebenszyklusmanagementkomplex als komplex empfinden. Die Absturzfehler, die dadurch entstehen, dass die Abhängigkeit vom Lebenszyklus nicht behandelt wird, können ein weiteres Zeichen dafür sein, dass einige Entwickler, auch wenn sie sich mit dem Lebenszyklus auskennen, vergessen, dies in jeder Aktivität / jedem Fragment zu berücksichtigen, die sie in ihrer App verwenden. In großen Apps kann dies trotz der negativen Auswirkungen auf die Produktivität zu einem Problem werden.
Unter dem Strich wird von einer
LiveData
größeren Anzahl von Entwicklern erwartet, dass sie MVVM einführen , ohne das Lebenszyklusmanagement, den Speicherverlust und den Absturz verstehen zu müssen. Auch wenn ich keinen Zweifel daran habe, dass dies in Bezug auf die Fähigkeiten und die Leistung, die es Entwicklern bietet ,LiveData
nicht vergleichbar istRxJava
, ist die reaktive ProgrammierungRxJava
für viele ein schwer verständliches Konzept und Werkzeug. Auf der anderen Seite denke ich nicht,LiveData
dass es ein Ersatz für sein sollRxJava
- es kann einfach nicht - sein soll, sondern ein sehr einfaches Werkzeug zur Behandlung eines umstrittenen, weit verbreiteten Problems, das bei vielen Entwicklern auftritt.** UPDATE ** Ich habe hier einen neuen Artikel hinzugefügt , in dem ich erklärt habe, wie der Missbrauch von LiveData zu unerwarteten Ergebnissen führen kann. RxJava kann in diesen Situationen zur Rettung kommen
quelle
LiveData
entsorgen würdeonStop
tatsächlichWie Sie vielleicht im reaktiven Ökosystem wissen, haben wir ein Observable , das Daten ausgibt , und einen Observer , der diese Observable-Emission abonniert (benachrichtigt wird). Nichts Seltsames ist, wie das sogenannte Observer-Muster funktioniert. Ein Observable "schreit" etwas, der Beobachter wird benachrichtigt, dass Observable in einem bestimmten Moment etwas schreit.
Stellen Sie sich
LiveData
ein Observable vor, mit dem Sie die Beobachter verwalten können, die sich in einemactive
Zustand befinden. Mit anderen WortenLiveData
ist ein einfaches Observable , kümmert sich aber auch um den Lebenszyklus.Aber sehen wir uns die beiden von Ihnen angeforderten Codefälle an:
A) Live-Daten
B) RXJava
A) Dies ist eine grundlegende Implementierung von LiveData
1) Normalerweise instanziieren Sie LiveData im ViewModel, um die Orientierungsänderung beizubehalten (Sie können schreibgeschützte LiveData oder beschreibbare MutableLiveData verwenden, sodass Sie normalerweise außerhalb der Klasse LiveData verfügbar machen).
2) im
OnCreate
Verfahren der Hauptaktivität (nicht das Ansichtsmodell) Sie „subscribe“ ein Observer - Objekt (in der Regel eines eine onChanged - Methode)3) Sie starten die Methode beobachten, um die Verbindung herzustellen
Zuerst die
ViewModel
(besitzt die Geschäftslogik)Und das ist das
MainActivity
(so dumm wie möglich)B) Dies ist die grundlegende Implementierung von RXJava
1) Sie deklarieren ein Observable
2) Sie deklarieren einen Beobachter
3) Sie abonnieren das Observable beim Observer
Insbesondere
LiveData
wird mitLifecycle
und häufig mitViewModel
(wie wir gesehen haben) Architekturkomponenten verwendet. InLiveData
Kombination mit einem ViewModel können Sie jede Änderung im Observer in Echtzeit auf dem neuesten Stand halten, sodass die Ereignisse bei Bedarf in Echtzeit verwaltet werden. Die VerwendungLiveData
wird dringend empfohlen, um das Konzept des Lebenszyklus und die relativen Objekte LifeCycleOwner / LifeCycle zu kennen . Ich würde Ihnen auch empfehlen , sich Transformationen anzuschauen , wenn Sie sieLiveData
in realen Szenarien implementieren möchten . Hier finden Sie einige Anwendungsfälle aus der großen Commonsware .Zum Abschluss im Grunde
LiveData
ist eine vereinfachtesRXJava
, eine elegante Art und Weise Änderungen über mehrere Komponenten zu beobachtenohne explizit sogenannte Abhängigkeitsregeln zwischen den Komponentenschaffen, so dass Sie viel einfacherden Code testen und macht es viel besser lesbar. Mit RXJava können Sie die Dinge von LiveData und vieles mehr erledigen. Aufgrund der erweiterten Funktionen von RXJava können Sie sowohl LiveData für einfache Fälle verwenden als auch die gesamte Leistungsfähigkeit von RXJava nutzen und weiterhin Android-Architekturkomponenten als ViewModel verwenden . Dies bedeutet natürlich, dassRXJava
dies weitaus komplexer sein kann. Denken Sie nur, dass stattdessen Hunderte von Operatoren vorhanden sind von SwitchMap und Map von LiveData (im Moment).RXJava Version 2 ist eine Bibliothek, die das objektorientierte Paradigma revolutionierte und eine sogenannte funktionale Methode zur Verwaltung des Programmflusses hinzufügte.
quelle
LiveData ist eine Teilmenge der Komponenten der Android-Architektur, die vom Android-Team entwickelt wurden.
Bei den Live-Daten und anderen Architekturkomponenten werden Speicherlecks und ähnliche Probleme von Architekturkomponenten behandelt. Da es vom Android-Team entwickelt wurde, ist es das Beste für Android. Sie bieten auch Updates für neue Versionen von Android.
Wenn Sie nur in der Android-App-Entwicklung verwenden möchten, wählen Sie die Android-Architekturkomponenten. Andernfalls verwenden Sie RxJava, wenn Sie andere Java-Apps wie Web-Apps, Desktop-Apps usw. verwenden möchten
quelle
LiveData
als Dateninhabersache und sonst nichts. Wir können auch sagen, dass LiveData ein Lifecycle-fähiger Verbraucher ist.LiveData
Es wird dringend empfohlen, das Konzept des Lebenszyklus und die relativen Objekte LifeCycleOwner / LifeCycle zu kennen. Sie erhalten Transformations- und Stream-Funktionen für Ihre Geschäftslogik und einen lebenszyklusbewussten Betrieb für Ihre Benutzeroberfläche.Rx ist ein leistungsstarkes Tool, mit dem Probleme in einem eleganten deklarativen Stil gelöst werden können. Es behandelt geschäftsseitige Optionen oder Service-API-Vorgänge
quelle
Beim Vergleich von LiveData mit RxJava werden Äpfel mit Obstsalaten verglichen.
Vergleichen Sie LiveData mit ContentObserver und Sie vergleichen Äpfel mit Äpfeln. LiveData ist effektiv ein lebenszyklusbewusster Ersatz für ContentObserver.
Beim Vergleich von RxJava mit AsyncTask oder einem anderen Threading-Tool werden Obstsalate mit Orangen verglichen, da RxJava nicht nur beim Threading hilft.
quelle
LiveData entspricht teilweise Rx Subject oder SharedRxObservable
LiveData verwaltet den Lebenszyklus des Abonnements, das Rx Subject-Abonnement sollte jedoch manuell erstellt und entsorgt werden
LiveData hat keinen Beendigungsstatus, aber Rx Subject hat OnError und OnCompleted
quelle