Je ne comprends pas la raison d'utiliser RxJava dans Android et LiveData à partir de composants architecturaux Android.Il serait vraiment utile que les cas d'utilisation et les différences entre les deux soient expliqués avec un exemple d'exemple sous forme de code qui explique les différences entre les deux.
197
Réponses:
Android LiveData est une variante du modèle d'observateur d'origine, avec l'ajout de transitions actives / inactives. En tant que tel, sa portée est très restrictive.
À l'aide de l'exemple décrit dans Android LiveData , une classe est créée pour surveiller les données de localisation, puis s'inscrire et se désinscrire en fonction de l'état de l'application.
RxJava fournit des opérateurs beaucoup plus généralisés. Supposons que cette observable fournira des données de localisation:
Observable<LocationData> locationObservable;
L'implémentation de l'observable peut être construite en utilisant
Observable.create()
pour mapper les opérations de rappel. Lorsque l'observable est abonné, le rappel est enregistré, et lorsqu'il est désabonné, le rappel n'est pas enregistré. L'implémentation ressemble beaucoup au code fourni dans l'exemple.Supposons également que vous ayez une observable qui émet true lorsque l'application est active:
Observable<Boolean> isActive;
Ensuite, vous pouvez fournir toutes les fonctionnalités de LiveData comme suit
Observable<LocationData> liveLocation = isActive .switchMap( active -> active ? locationObservable : Observable.never() );
L'
switchMap()
opérateur fournira soit l'emplacement actuel sous forme de flux, soit rien si l'application n'est pas active. Une fois que vous avez l'liveLocation
observable, vous pouvez en faire beaucoup en utilisant les opérateurs RxJava. Mon exemple préféré est:liveLocation.distinctUntilChanged() .filter( location -> isLocationInAreaOfInterest( location ) ) .subscribe( location -> doSomethingWithNewLocation( location ) );
Cela n'effectuera l'action que lorsque l'emplacement a changé et que l'emplacement est intéressant. Vous pouvez créer des opérations similaires qui combinent des opérateurs de temps pour déterminer la vitesse. Plus important encore, vous pouvez fournir un contrôle détaillé pour savoir si les opérations se produisent dans le thread principal, ou un thread d'arrière-plan ou plusieurs threads, à l'aide des opérateurs RxJava.
L'intérêt de RxJava est qu'il combine le contrôle et la synchronisation dans un seul univers, en utilisant les opérations fournies par la bibliothèque, ou même les opérations personnalisées que vous fournissez.
LiveData n'aborde qu'une petite partie de cet univers, l'équivalent de la création du
liveLocation
.la source
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.
Mais n'est pas conscient du cycle de vie LiveData. Si nous devions utiliser Rx, n'aurions-nous pas à gérer les changements du cycle de vie?En ce qui concerne la question initiale, RxJava et LiveData se complètent très bien.
LiveData
brille sur la couche ViewModel, avec son intégration étroite avec les cycles de vie Android etViewModel
.RxJava
fournit plus de capacités dans les transformations (comme mentionné par @Bob Dalgleish).Actuellement, nous utilisons
RxJava
dans les couches de source de données et de référentiel, et il est transformé enLiveData
(utilisationLiveDataReactiveStreams
) dans ViewModels (avant d'exposer les données à des activités / fragments) - assez satisfaits de cette approche.la source
observeOn
, leLiveDataReactiveStreams
fait quand même en appelantLiveData.postValue()
. Et il n'y a aucune garantie que votresubscribeOn
volonté aura un effet en général.Il existe de nombreuses différences entre LiveData et RxJava:
public class RegistrationViewModel extends ViewModel { Disposable disposable; private RegistrationRepo registrationRepo; private MutableLiveData<RegistrationResponse> modelMutableLiveData = new MutableLiveData<>(); public RegistrationViewModel() { } public RegistrationViewModel(RegistrationRepo registrationRepo) { this.registrationRepo = registrationRepo; } public void init(RegistrationModel registrationModel) { disposable = registrationRepo.loginForUser(registrationModel) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Response<RegistrationResponse>>() { @Override public void accept(Response<RegistrationResponse> registrationModelResponse) throws Exception { modelMutableLiveData.setValue(registrationModelResponse.body()); } }); } public LiveData<RegistrationResponse> getModelLiveData() { return modelMutableLiveData; } @Override protected void onCleared() { super.onCleared(); disposable.dispose(); } }
la source
onCleared
.En fait,
LiveData
n'est pas un outil essentiellement différentRxJava
, alors pourquoi at - il été introduit en tant que composante de l' architecture oùRxJava
aurait pu facile à gérer le cycle de vie en stockant tous les abonnements à des observables dans unCompositeDispoable
objet, puis les disposer dansonDestroy()
desActivity
ouonDestroyView()
de l'Fragment
utilisation d' un seul ligne de code?J'ai répondu entièrement à cette question en créant une application de recherche de films une fois en utilisant RxJava, puis en utilisant LiveData ici .
Mais en bref, oui, c'est possible, mais il faudrait d'abord remplacer les méthodes de cycle de vie pertinentes en plus d'avoir les connaissances de base sur le cycle de vie. Cela n'a peut-être toujours pas de sens pour certains, mais le fait est que selon l'une des sessions Jetpack de Google I / O 2018, de nombreux développeurs trouvent la gestion du cycle de vie complexe. Les erreurs de plantage résultant de la non-gestion de la dépendance au cycle de vie peuvent être un autre signe que certains développeurs, même s'ils connaissent le cycle de vie, oublient de s'en occuper dans chaque activité / fragment qu'ils utilisent dans leur application. Dans les grandes applications, cela pourrait devenir un problème, malgré l'effet négatif que cela pourrait avoir sur la productivité.
L'essentiel est qu'en introduisant
LiveData
, un plus grand nombre de développeurs devraient adopter MVVM sans même avoir à comprendre la gestion du cycle de vie, les fuites de mémoire et les pannes. Même si je n'ai aucun doute que ceLiveData
n'est pas comparableRxJava
en termes de capacités et de puissance qu'elle donne aux développeurs, la programmation réactive etRxJava
c'est un concept et un outil difficile à comprendre pour beaucoup. D'un autre côté, je ne pense pas que ceLiveData
soit censé remplacerRxJava
- ce n'est tout simplement pas possible - mais un outil très simple pour gérer un problème très répandu et controversé rencontré par de nombreux développeurs.** MISE À JOUR ** J'ai ajouté un nouvel article ici où j'ai expliqué comment une mauvaise utilisation de LiveData peut conduire à des résultats inattendus. RxJava peut venir à la rescousse dans ces situations
la source
LiveData
disposerait enonStop
faitComme vous le savez peut-être dans l'écosystème réactif, nous avons un observable qui émet des données et un observateur qui s'abonne (se fait notifier) de cette émission observable, rien d'étrange n'est comment fonctionne le soi-disant modèle d'observateur. Un observable «crie» quelque chose, l'observateur est notifié que l'observable crie quelque chose à un moment donné.
Pensez à
LiveData
un observable qui vous permet de gérer les observateurs qui sont dans unactive
état. En d'autres termes,LiveData
c'est un simple observable mais prend également en charge le cycle de vie.Mais voyons les deux cas de code que vous demandez:
A) Données en direct
B) RXJava
A) Ceci est une implémentation de base de LiveData
1) vous instanciez généralement LiveData dans le ViewModel pour maintenir le changement d'orientation (vous pouvez avoir LiveData en lecture seule, ou MutableLiveData en écriture, donc vous exposez généralement en dehors de la classe LiveData)
2) dans la
OnCreate
méthode de l' activité principale (pas le ViewModel), vous «abonnez» un objet Observer (généralement une méthode onChanged)3) vous lancez la méthode observer pour établir le lien
D'abord le
ViewModel
(possède la logique métier)class ViewModel : ViewModel() { //Point 1 var liveData: MutableLiveData<Int> = MutableLiveData() }
Et c'est le
MainActivity
(aussi stupide que possible)class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java) ViewModelProvider.observe(this, Observer {//Points 2 and 3 //what you want to observe }) } } }
B) Ceci est l'implémentation de base de RXJava
1) vous déclarez un observable
2) vous déclarez un observateur
3) vous souscrivez à l'Observable avec l'Observer
Observable.just(1, 2, 3, 4, 5, 6) // Point 1 .subscribe(new Subscriber() { //Points 2 & 3 @Override public void onCompleted() { System.out.println("Complete!"); } @Override public void onError(Throwable e) { } @Override public void onNext(Double value) { System.out.println("onNext: " + value); } });
En particulier, il
LiveData
est utilisé avecLifecycle
et souvent avecViewModel
(comme nous l'avons vu) des composants d'architecture. En fait, quandLiveData
est combiné avec un ViewModel vous permet de garder à jour en temps réel chaque changement dans l'Observer, de sorte que les événements sont gérés en temps réel là où c'est nécessaire. L'utilisationLiveData
est fortement recommandée pour connaître le concept de cycle de vie et les objets relatifs LifeCycleOwner / LifeCycle , aussi je vous suggère de jeter un oeil à Transformations , si vous souhaitez implémenterLiveData
dans des scénarios de la vie réelle. Vous trouverez ici quelques cas d'utilisation du grand logiciel commun .Pour conclure essentiellement
LiveData
est unesimplifiéeRXJava
,une manière élégante d'observerchangements sur plusieurs composants sans créerrègles de dépendance explicites soidisant entre les composants,sorte que vous pouvez tester beaucoup plus facile le code etrendre beaucoup plus facilelire. RXJava, vous permet de faire les choses de LiveData et bien plus encore. En raison des fonctionnalités étendues de RXJava, vous pouvez à la fois utiliser LiveData pour des cas simples ou exploiter toute la puissance de RXJava continuer à utiliser des composants d'architecture Android comme ViewModel , bien sûr, cela signifie que celaRXJava
peut être beaucoup plus complexe, pensez simplement à des centaines d'opérateurs à la place de SwitchMap et Map of LiveData (pour le moment).RXJava version 2 est une bibliothèque qui a révolutionné le paradigme orienté objet, en ajoutant une méthode dite fonctionnelle pour gérer le flux du programme.
la source
LiveData est un sous-ensemble des composants de l'architecture Android qui est développé par l'équipe Android.
Avec les données en direct et d'autres composants d'architecture, les fuites de mémoire et d'autres problèmes similaires sont gérés par les composants d'architecture. Puisqu'il est développé par l'équipe Android, c'est le meilleur pour Android. Ils fournissent également des mises à jour qui gèrent les nouvelles versions d'Android.
Si vous ne souhaitez utiliser que dans le développement d'applications Android, optez pour les composants d'architecture Android. Sinon, si vous souhaitez utiliser une autre application Java, comme une application Web, des applications de bureau, etc., utilisez RxJava
la source
LiveData
comme une chose de détenteur de données et rien d'autre. Nous pouvons également dire que LiveData est un consommateur conscient du cycle de vie.LiveData
Il est fortement recommandé de connaître le concept de cycle de vie et les objets relatifs LifeCycleOwner / LifeCycle, vous obtenez des capacités de transformation et de flux pour votre logique métier et une opération tenant compte du cycle de vie de votre interface utilisateur.Rx est un outil puissant qui permet de résoudre des problèmes dans un style déclaratif élégant. Il gère les options côté entreprise ou les opérations de service Api
la source
Comparer LiveData à RxJava, c'est comparer des pommes avec des salades de fruits.
Comparez LiveData à ContentObserver et vous comparez des pommes avec des pommes. LiveData est en fait un remplacement sensible au cycle de vie de ContentObserver.
Comparer RxJava à AsyncTask ou à tout autre outil de filetage consiste à comparer des salades de fruits à des oranges, car RxJava aide avec plus que le simple filetage.
la source
LiveData est partiellement égal à Rx Subject ou SharedRxObservable
LiveData gère le cycle de vie de l'abonnement, mais l'abonnement Rx Subject doit être créé et supprimé manuellement
LiveData n'a pas d'état de terminaison mais Rx Subject a OnError et OnCompleted
la source