L'observation LiveData de ViewModel
J'ai une classe distincte dans laquelle j'ai la poignée de la récupération de données (plus précisément Firebase) et j'ai l'habitude de retourner LiveData objets et de les mettre à jour de manière asynchrone. Maintenant, je veux avoir le retour des données stockées dans un ViewModel, mais le problème est que pour obtenir cette valeur, j'ai besoin d'observer la LiveData objet de retour de mon la récupération de données de la classe. Observer la méthode requise d'un LifecycleOwner objet en tant que premier paramètre, mais évidemment je n'ai pas qu'à l'intérieur de mon ViewModel et je sais que je ne suis pas censé le garder en référence à l'Activité/Fragment à l'intérieur de ce Dernier. Que dois-je faire?
Vous devez vous connecter pour publier un commentaire.
Dans ce blog par Google developer Jose Alcérreca il est recommandé d'utiliser une transformation dans ce cas (voir le "LiveData dans les dépôts" paragraphe).
Dans ViewModel documentation
Une autre façon est pour les données à mettre en œuvre RxJava plutôt que LiveData, alors il n'aura pas l'avantage de cycle de vie-conscience.
Dans google échantillon de todo-mvvm-live-kotlin, il utilise une fonction de callback sans LiveData dans le ViewModel.
Je suppose que si vous souhaitez de se conformer à l'ensemble de l'idée de cycle de vie-ware, nous devons aller de l'observation du code de l'Activité/Fragment. Sinon, nous pouvons utiliser le callback ou RxJava dans le ViewModel.
Un autre compromis est de mettre en œuvre MediatorLiveData (ou Transformations) et d'observer (mettez votre logique ici) dans le ViewModel. Avis MediatorLiveData observateur ne se déclenche pas (même en tant que Transformations), sauf si elle est observée dans l'Activité/Fragment. Ce que nous faisons, c'est de mettre un blanc d'observer dans l'Activité/Fragment, où le vrai travail est fait dans le ViewModel.
PS: j'ai lu Viewmodel et LiveData: Modèles + AntiPatterns qui suggère que des Transformations. Je ne pense pas qu'il fonctionne que si les LiveData est observée (qui a probablement besoin d'être faite à l'Activité/Fragment).
Je pense que vous pouvez utiliser observeForever qui ne nécessite pas le cycle de vie du propriétaire de l'interface et vous pouvez observer les résultats de la viewmodel
Cannot invoke observeForever on a background thread