web-dev-qa-db-fra.com

Services et ViewModels dans Android MVVM - Comment interagissent-ils?

J'utilise ViewModels de Android Architecture depuis un certain temps maintenant, et je ne suis jamais en train d'exposer le ViewModel au contexte/aux vues (Android Framework/UI). Cependant, récemment, j'ai rencontré un intéressant problème.

Lors de la création d'une application de minuteur, lorsqu'un minuteur est démarré, un service est exécuté en arrière-plan exécutant le minuteur. De cette façon, lorsque l'application est fermée, le minuteur s'exécute toujours au premier plan dans la barre de notification jusqu'à ce que tous les minuteurs aient cessé. Cependant, cela signifie que tous mes objets Timer et l'état sont contenus dans ce service. Mon interface utilisateur doit être mise à jour à chaque tick, mais le modèle n'a pas nécessairement besoin d'être mis à jour Comment les ViewModels s'intègrent-ils dans ce scénario?

L'activité doit-elle recevoir les LocalBroadcasts et informer le ViewModel à chaque fois? Faut-il lire l'état de l'interface utilisateur dans Service-> Activity-> VM? Il semble presque que le service soit le ViewModel, mais cela ne semble pas efficace.

14
Josh Ribeiro

Après avoir joué avec différentes structures, le Service a trouvé sa place dans MVVM. Ce qui me décourageait dans cette situation, c'était de penser qu'un service ne devrait pas être démarré à partir d'un ViewModel et le fait que deux référentiels étaient nécessaires: la base de données de la salle pour stocker les temporisateurs et un service pour représenter l'état des temporisateurs en cours (onTick, play/pause statut, etc.). Un ViewModel ne doit pas avoir de référence aux vues, mais le contexte d'application est OK. Il est donc possible de démarrer le service à partir d'un ViewModel en étendant la classe AndroidViewModel. Voici la structure finale:

Couche modèle

  • Service - Maintient une liste des temporisateurs actifs, émet les événements onTick () EventBus, maintient l'état de lecture/pause du temporisateur actif. Se termine une fois qu'il n'y a pas de temporisation active.
  • Base de données de la salle - Stocke les minuteries pour une utilisation future (nom, durée totale, etc.)

ViewModel

  • ViewModel - Écoute les événements de l'interface utilisateur, exécute la logique métier et émet des publications EventBus. Tout changement de modèle est communiqué via le ViewModel

UI

  • ( Activité - exécute des tâches de flux d'application. Écoute les communications pertinentes de ViewModel pour échanger des fragments/démarrer de nouvelles activités, etc.
  • Fragment - gère les animations et l'interface utilisateur. Avertit également ViewModel de l'interaction de l'utilisateur
0
Josh Ribeiro