Récemment, j'ai exploré l'architecture Android, qui a été introduite récemment par Google. Depuis le Documentation J'ai trouvé ça :
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
l'activité peut accéder à cette liste comme suit :
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Ma question est la suivante : je vais le faire :
-
dans le
loadUsers()
Je récupère les données de manière asynchrone et je vérifie d'abord la base de données (Room) pour ces données. -
Si je n'obtiens pas les données à cet endroit, je ferai un appel à l'API pour récupérer les données du serveur web.
-
Je vais insérer les données récupérées dans la base de données (Room) et mettre à jour l'interface utilisateur en fonction de ces données.
Quelle est l'approche recommandée pour ce faire ?
Si je commence un Service
pour appeler l'API à partir du loadUsers()
comment puis-je mettre à jour la méthode MutableLiveData<List<User>> users
de cette variable Service
?
11 votes
Tout d'abord, il vous manque un Repository. Votre ViewModel ne devrait pas faire de tâches de chargement de données. De plus, puisque vous utilisez Room, votre service n'a pas besoin de mettre à jour directement les LiveData dans le ViewModel. Le service peut se contenter d'insérer des données dans Room, tandis que votre ViewModelData doit être attaché uniquement à Room, et recevoir des mises à jour de Room (après que le service ait inséré des données). Mais pour obtenir la meilleure architecture possible, regardez l'implémentation de la classe NetworkBoundResource au bas de cette page : developer.Android.com/topic/bibliothèques/architecture/guide.html
0 votes
merci pour la suggestion :)
1 votes
La classe Repositor n'est pas mentionnée dans les documents offocials décrivant ROOM ou les composants de l'architecture Android.
2 votes
Le référentiel est une bonne pratique suggérée pour la séparation du code et l'architecture, regardez cet exemple : codelabs.developers.google.com/codelabs/
1 votes
La fonction
loadUsers()
va appeler le répertoire pour obtenir les informations sur l'utilisateur.