Récemment, j'explore l'architecture Android, qui a été récemment introduite par Google. D'après la documentation, j'ai trouvé ceci:
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, je vais faire ceci:
dans la
loadUsers()
fonction je récupère les données de manière asynchrone où je vais d'abord vérifier la base de données (Room) pour ces donnéesSi je n'obtiens pas les données là-bas, je passerai un appel 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 des données.
Quelle est l'approche recommandée pour ce faire?
Si je lance un Service
appel à l'API à partir de la loadUsers()
méthode, comment puis-je mettre à jour la MutableLiveData<List<User>> users
variable à partir de cela Service
?
la source
loadUsers()
appellera essentiellement le dépôt pour obtenir les informations utilisateurRéponses:
Je suppose que vous utilisez des composants d'architecture Android . En fait, peu importe où vous appelez
service, asynctask or handler
pour mettre à jour les données. Vous pouvez insérer les données du service ou de l'asynctask à l'aide de lapostValue(..)
méthode. Votre classe ressemblerait à ceci:Comme l'
users
estLiveData
, laRoom
base de données est responsable de fournir des données des utilisateurs partout où il est inséré.Note:
Dans l'architecture de type MVVM, le référentiel est principalement responsable de la vérification et de l'extraction des données locales et des données distantes.la source
LiveData
ne met pas à jourusers.postValue(mUsers);
-> Mais, la méthode postValue de MutableLiveData est-elle capable d'accepter LiveData ???value
au lieu depostValue
. Merci pour votre réponse.Vous pouvez utiliser la
MutableLiveData<T>.postValue(T value)
méthode du thread d'arrière-plan.la source
.setValue()
ce ne serait pas autoriséSi l'application récupère les données utilisateur sur un thread d'arrière-plan, postValue (plutôt que setValue ) sera utile.
Dans la méthode loadData, il y a une référence à l'objet "users" MutableLiveData. La méthode loadData récupère également des données utilisateur fraîches quelque part (par exemple, un référentiel).
Maintenant, si l'exécution se fait sur un thread d'arrière-plan, MutableLiveData.postValue () met à jour les observateurs extérieurs de l'objet MutableLiveData.
Peut-être quelque chose comme ça:
la source
getUsers()
méthode du référentiel peut appeler une api pour les données asynchrones (peut démarrer un service ou une asynctask pour cela) dans ce cas, comment peut-elle renvoyer la liste à partir de son instruction return?Jetez un œil au guide d'architecture Android qui accompagne les nouveaux modules d'architecture comme
LiveData
etViewModel
. Ils discutent de cette question exacte en profondeur.Dans leurs exemples, ils ne le mettent pas dans un service. Regardez comment ils le résolvent en utilisant un module «référentiel» et Retrofit. Les addenda en bas comprennent des exemples plus complets, notamment la communication de l'état du réseau, le signalement des erreurs, etc.
la source
Si vous appelez votre API dans Repository,
Dans le référentiel :
Dans ViewModel
En activité / fragment
Remarque: en utilisant JAVA_1.8 lambda ici, vous pouvez l'utiliser sans
la source