Wann RxJava in Android und zu verwenden wenn LiveData von Android Architektonischen Komponenten?
Bin ich nicht immer der Grund für die Verwendung RxJava in Android und LiveData von Android Architektonischen Komponenten.Es wäre wirklich hilfreich, wenn die usecases und Unterschiede zwischen den beiden erläutert werden zusammen mit Beispiel in form von code, was erklärt die Unterschiede zwischen den beiden.
- Haben Sie einen guten Grund, noch? Frage ich mich das gleiche...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Android LiveData ist eine Variante des original-observer-Muster, mit dem Zusatz von aktiven/inaktiven übergänge. Als solche, es ist sehr restriktiv in seiner Tragweite.
Am Beispiel beschrieben in Android LiveData, a-Klasse wird erstellt, um zu überwachen, Standort-Daten, und registrieren und aufheben der Registrierung basiert auf den Zustand der Anwendung.
RxJava bietet dem Betreiber, viel mehr verallgemeinert. Lassen Sie uns annehmen, dass das beobachtbare bieten Standortdaten:
Die Umsetzung des beobachtbaren aufgebaut werden kann, mit
Observable.create()
Karte der call-back-Operationen. Wenn die beobachtbaren abonniert ist, wird der Anruf wieder registriert ist, und wenn es ist abgemeldet, wird der Anruf wieder nicht registriert ist. Die Implementierung ähnelt sehr der code aus dem Beispiel.Lassen Sie uns auch annehmen, dass Sie eine observable, die strahlt true, wenn die Anwendung aktiv:
Dann können Sie alle Funktionalitäten von LiveData durch die folgenden
Den
switchMap()
Betreiber wird entweder die aktuelle Position im stream, oder gar nichts, wenn die Anwendung nicht aktiv ist. Sobald Sie dieliveLocation
beobachtbar ist, gibt es eine Menge Dinge, die Sie tun können, mit Hilfe von RxJava Betreiber. Mein Lieblings-Beispiel ist:Wird nur die Aktion ausführen, wenn sich der Ort geändert, und die Lage ist interessant. Sie können erstellen Sie ähnliche Operationen,
kombinieren Sie Zeit-Operatoren bestimmen die Geschwindigkeit. Noch wichtiger ist, können Sie ausführliche Kontrolle, ob Operationen geschehen in der Haupt-thread, oder einen hintergrund-thread oder mehrere threads, mit RxJava Betreiber.
Den Punkt RxJava ist, dass Sie kombiniert Steuerung und timing in einem einzigen Universum, mit Operationen zur Verfügung gestellt von der Bibliothek, oder sogar benutzerdefinierte Operationen, die Sie stellen.
LiveData-Adressen nur ein kleiner Teil des Universums, das entspricht der Aufbau der
liveLocation
.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.
Aber nicht LiveData lifecycle bewusst. Wenn wir Rx, würden wir nicht haben, um die lifecycle-änderungen?Bezug auf die ursprüngliche Frage, die beide RxJava und LiveData ergänzen einander wirklich gut.
LiveData
scheint auf den ViewModel-layer, mit dessen enge integration mit Android-Lebenszyklen undViewModel
.RxJava
bietet mehr Funktionen bei Transformationen (wie erwähnt von @Bob Dalgleish).Momentan sind wir mit
RxJava
im Datenquellen-und repository-Schichten, und es verwandelt sich inLiveData
(mitLiveDataReactiveStreams
) in ViewModels (vor Verfügbarmachen von Daten zu Aktivitäten/Fragmente) - sehr zufrieden mit diesem Ansatz.LiveDataReactiveStreams.fromPublisher(this.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()))
observeOn
,LiveDataReactiveStreams
hat, die sowieso durch den AufrufLiveData.postValue()
. Und es gibt keine Garantie, IhrsubscribeOn
haben keine Wirkung im Allgemeinen.In der Tat
LiveData
ist nicht ein grundsätzlich anderes toolRxJava
, also warum wurde es eingeführt, als eine Architektur-Komponente, wennRxJava
könnte leicht verwaltet den Lebenszyklus durch die Speicherung alle Anmeldungen, die zu observablen in einemCompositeDispoable
Objekt und dann entsorgen Sie Sie inonDestroy()
desActivity
oderonDestroyView()
desFragment
mit nur einer Zeile code?Habe ich beantwortet diese Frage vollständig durch den Bau einer Film Suche app einmal mit RxJava und dann mit LiveData hier.
Aber kurz gesagt, ja, das könnte es, aber das müsste zuerst überschreiben die entsprechenden lifecycle-Methoden neben der basic-lifecycle-wissen. Diese noch nicht sinnvoll für einige, aber die Tatsache ist, dass nach einem der Jetpack-sessions in Google-I/O-2018 viele Entwickler lifecycle management Komplex. Der crash-Fehler aufgrund von nicht handling lifecycle-Abhängigkeit könnte ein weiteres Zeichen dafür, dass einige Entwickler, auch wenn kenntnisreich, lifecycle, vergessen zu kümmern, dass in jeder Activity /Fragment, die Sie in der app. Im großen apps könnte dies zu einem Problem werden, trotz der negativen Auswirkungen könnte es haben auf die Produktivität.
Die Quintessenz ist, dass durch die Einführung
LiveData
größere Anzahl von Entwicklern erwartet, um anzunehmen, MVVM, ohne auch nur zu verstehen, lifecycle-management, memory Leck wird und abstürzt. Obwohl ich habe keinen Zweifel, dassLiveData
ist nicht vergleichbar mitRxJava
in Bezug auf die Fähigkeiten und die Energie, die es gibt Entwickler, reaktive Programmierung undRxJava
ist schwer zu verstehen, Konzept und Werkzeug für viele. Auf der anderen Seite, ich glaube nicht, dassLiveData
ist dazu gedacht, ein Ersatz fürRxJava
–es kann einfach nicht–aber ein sehr einfaches Werkzeug für den Umgang mit einem umstrittenen weit verbreitetes Problem erfahren viele Entwickler.** UPDATE **
Ich habe soeben einen neuen Artikel hier, wo ich erklärt habe, wie missbrauchen LiveData kann zu unerwarteten Ergebnissen führen. RxJava können kommen, um zu retten, die in diesen Situationen
LiveData
würde entsorgen inonStop
eigentlichWie Sie vielleicht wissen, in der reaktiven ökosystem haben wir eine Beobachtbaren, dass sendet Daten und eine Beobachter, die abonniert( benachrichtigt werden) dieser Beobachtbaren emission, nichts ungewöhnliches ist, wie funktioniert das so genannte Observer-Muster. Eine Beobachtbare "schreit"etwas, das der Beobachter benachrichtigt werden, dass die Beobachtbaren Schreien, etwas in einem gegebenen moment.
Denke
LiveData
als eine Beobachtbare, dass ermöglicht Ihnen zu verwalten, die Beobachter, die in einemactive
Zustand. In anderen WortenLiveData
ist eine einfache Beobachtbare aber auch kümmert sich um die life-cycle.Aber mal sehen, die beiden code-Fällen, die Sie verlangen:
A) Live-Daten
B) RXJava
A)Dies ist eine grundlegende Implementierung von LiveData
1) Sie in der Regel instanziieren LiveData im ViewModel um die Orientierung zu behalten ändern (Sie können LiveData ist nur zu Lesen, oder MutableLiveData, die auch beschreibbar sind, so dass Sie in der Regel aussetzen, die außerhalb von der Klasse LiveData)
2) in der
OnCreate
Methode der Main Aktivität(nicht die ViewModel -)Sie "abonnieren" ein Beobachter-Objekt (in der Regel eine a-Methode onChanged-Ereignisse)
3) starten Sie die Methode beobachten, um die Verbindung
Zuerst die
ViewModel
(besitzt die business-Logik)- Und dies ist die
MainActivity
( so dumm wie möglich)B)Dies ist die grundlegende Implementierung von RXJava
1) deklarieren Sie eine Beobachtbare
2) Sie erklären Beobachter
3) Sie abonnieren die Beobachtbaren mit dem Betrachter
Insbesondere
LiveData
mitLifecycle
und oft mitViewModel
(wie wir gesehen haben) - Architektur-Komponenten. In der Tat, wennLiveData
ist kombiniert mit einem ViewModel ermöglicht Ihnen zu halten, die in Echtzeit aktualisiert wird jede änderung in den Betrachter, so, dass die Ereignisse verwaltet werden, in Echtzeit, wo erforderlich ist. VerwendenLiveData
wird dringend empfohlen, zu wissen, das Konzept der lifecycle und die relative Objekte LifeCycleOwner/LifeCycle, auch ich würde dir empfehlen, einen Blick auf Transformationen, wenn Sie implementieren möchtenLiveData
im real life Szenarien. Hier finden Sie einige Anwendungsfälle aus der großen commonsware.Zu wickeln im Grunde
LiveData
ist eine vereinfachteRXJava
eine elegante Weise zu beobachten, Veränderungen über mehrere Komponenten, ohne die Schaffung expliziter sogenannten Regeln für Abhängigkeiten zwischen den Komponenten, so dass Sie testen können, viel leichter den code und machen es sehr viel besser lesbar.RXJava, können Sie die Dinge tun, die von LiveData und vieles mehr. Aufgrund der erweiterten Funktionalitäten von RXJava, können Sie beide verwenden LiveData für einfache Fälle oder nutzen Sie alle die Kraft des RXJava halten mit Android-Architektur Komponenten wie die ViewModel, das bedeutet natürlich, dass
RXJava
können weitaus komplexer, man denke nur hat Hunderte von Operatoren statt SwitchMap und Anzeigen von LiveData(im moment).RXJava version 2 ist eine Bibliothek, die revolutioniert das objektorientierte Paradigma, indem eine so genannte funktionale Art und Weise zu verwalten den Fluss des Programms.
Gibt es viele Unterschiede zwischen LiveData und RxJava:
Wie Sie unten sehen können in den code, speichern Sie Ihre Antwort aus RxJava zu MutableLiveData (oder LiveData) und Ihre LiveData ist lifecycle-wissen, so in einer Art und Weise, Ihre Daten-lifecycle-bewusst. Nun, stellen Sie sich nur die Möglichkeit, wenn Sie Ihre Daten selbst wissen, Wann-und wenn-nicht-aktualisieren der Benutzeroberfläche verwendet werden.
onCleared
.LiveData ist eine Teilmenge der android-Architektur-Komponenten, die entwickelt wird, indem das android-team.
Mit live-Daten und andere Architektur-Komponenten, Speicher-Lecks und andere ähnliche Probleme behandelt werden, die von Architektur-Komponenten. Da ist es entwickelt von android-team, es ist das beste für android. Sie bieten auch updates, die mit neuen Versionen von Android.
Wenn Sie nur wollen, um den Einsatz in Android-app-Entwicklung gehen für die Android-Architektur-Komponenten. Andernfalls, wenn Sie verwenden möchten anderen Java-Anwendung, die wie web-app, desktop-apps, etc., verwenden RxJava
LiveData
als Daten-Halter-Ding und sonst nichts. Wir können auch sagen, LiveData ist Lifecycle bewusst ist Verbraucher.LiveData
wird dringend empfohlen, zu wissen, das Konzept des Lebenszyklus und der relativen Objekte LifeCycleOwner/LifeCycle, Sie bekommen Transformations-und stream-Funktionen für Ihre business-Logik und lifecycle-bewusst-Betrieb für die Benutzeroberfläche.Rx ist leistungsfähiges Werkzeug, das ermöglicht das lösen von problem in einem eleganten deklarativen Stil. Es behandelt das business-Seite Optionen oder Service-Api-Vorgänge