Comment mettre à jour LiveData d'un modèle de vue à partir du service background et mettre à jour L'interface utilisateur

récemment, j'explore L'Architecture Android, qui a été introduit récemment par google. À partir de 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, dans le loadUsers() fonction je récupère les données de façon asynchrone où je vais d'abord vérifier la base de données(pièce) pour ces données, si je n'y trouve pas les données, je vais faire un appel API pour récupérer les données du serveur web. Puis Je vais insérer les données récupérées dans la base de données(salle) et mettre à jour L'UI en fonction des données. Quelle est l'approche recommandée pour ce faire?

Si je commence un Service pour appeler L'API depuis le loadUsers() méthode, comment puis-je mettre à jour le MutableLiveData<List<User>> users la variable Service?

35
demandé sur CodeCameo 2017-05-26 18:15:19

5 réponses

je suis en supposant que vous utilisez composants d'architecture android. En fait, peu importe où vous appelez!--1--> mettre à jour les données. Vous pouvez insérer les données du service ou de l'asynctask en utilisant postValue(..) méthode. Votre classe devrait ressembler à ceci:

private void loadUsers() {
    // do async operation to fetch users and use postValue() method
    users.postValue(listOfData)
}

usersLiveData,Room La base de données est responsable de fournir les données des utilisateurs partout où elles sont insérées.

Note: en MVVM comme l'architecture, le référentiel est principalement responsable de la vérification et de tirer des données locales et des données à distance.

18
répondu androidcodehunter 2018-08-13 14:16:19

s'il vous Plaît, utiliser les données en direct postValue(..) méthode à partir du fil de fond.

private void loadUsers() {
    // do async operation to fetch users and use postValue() method
   users.postValue(listOfData)
}
36
répondu minhazur 2017-07-30 12:46:20

... dans la fonction loadUsers (), je récupère les données de manière asynchrone ... Si je lance un Service pour appeler L'API depuis la méthode loadUsers (), comment puis - je mettre à jour la variable MutableLiveData> users à partir de celle-ci? De Service?

Si l'application récupère les données de l'utilisateur sur un thread d'arrière-plan postValue plutôt que setValue) sera utile.

dans la méthode loadData, il est fait référence à la donnée MutableLiveData " utilisateurs" objet. La méthode loadData permet également de récupérer des données utilisateur fraîches à partir de quelque part (par exemple, un dépôt).

maintenant, si l'exécution est sur un fil d'arrière-plan, MutableLiveData.postValue () met à jour les observateurs extérieurs de L'objet MutableLiveData.

Peut-être quelque chose comme ceci:

private MutableLiveData<List<User>> users;

.
.
.

private void loadUsers() {
    // do async operation to fetch users
    ExecutorService service =  Executors.newSingleThreadExecutor();
    service.submit(new Runnable() {
        @Override
        public void run() {
            // on background thread, obtain a fresh list of users
            List<String> freshUserList = aRepositorySomewhere.getUsers();

            // now that you have the fresh user data in freshUserList, 
            // make it available to outside observers of the "users" 
            // MutableLiveData object
            users.postValue(freshUserList);        
        }
    });

}
12
répondu albert c braun 2017-06-08 20:21:13

regardez Android guide d'architecture qui accompagne les nouveaux modules d'architecture comme LiveData et ViewModel. Ils discutent de cette question en profondeur.

dans leurs exemples ils ne le mettent pas dans un service. Jetez un coup d'oeil à la façon dont ils résolvent cela en utilisant un module "de dépôt" et la modernisation. Les addenda en bas comprennent des exemples plus complets, y compris la communication de l'état du réseau, la déclaration des erreurs, etc.

4
répondu user1978019 2017-06-05 18:22:27

https://developer.android.com/topic/libraries/architecture/guide.html

A de très bonnes réponses à votre problème. Faites défiler tout le chemin vers le bas pour voir comment vous pouvez sauvegarder la réponse dans votre base de données et mettre à jour L'UI en utilisant les LiveData.

enter image description here

2
répondu Prakash 2018-04-17 21:02:50