web-dev-qa-db-fra.com

ViewModel survit-il à l'activité de sauvegarde et de restauration?

Les instances de la nouvelle classe ViewModel peuvent survivre aux modifications de configuration si elles sont utilisées de la manière suivante:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

Cependant, en plus des modifications de configuration, il existe également un scénario de sauvegarde-restauration lorsque l'ensemble du processus de l'application est tué.

Les valeurs des champs à l'intérieur de ViewModel seront-elles préservées pendant le scénario de sauvegarde-restauration?


Edit: basé sur la réponse à cette question, j'ai écrit cet article: Le composant d'architecture Android ViewModel est dangereux

14
Vasiliy

Selon ViewModelProvider documentation (vérifiez la méthode get), ViewModel n'est pas conservé lorsque le processus de l'application est tué:

Le ViewModel créé est associé à la portée donnée et sera conservé tant que la portée est vivante (par exemple, s'il s'agit d'une activité, jusqu'à ce qu'elle soit terminée ou que le processus soit tué)

De plus, vérifiez la réponse d'Ian Lake à une question similaire: https://medium.com/@ianhlake/you-are-correct-the-viewmodel-is-destroyed-if-your-process-is-killed-by -Android-ef611fcd51e6

Vous avez raison: le ViewModel est détruit si votre processus est tué par Android. Tout comme avant, vous devez utiliser onSaveInstanceState () pour stocker toutes les données dont vous avez besoin pour recréer ultérieurement votre activité dans le même état qu'auparavant.

Je recommande également de lire Le composant d'architecture Android ViewModel est dangereux .

14
Ziem

Il semble que Google propose une solution pour cela maintenant

Module d'état enregistré pour ViewModel

L'état de l'interface utilisateur est généralement stocké ou référencé dans les objets ViewModel, pas dans les activités; donc l'utilisation de onSaveInstanceState () nécessite un passe-partout que ce module peut gérer pour vous.

Lorsque le module est configuré, les objets ViewModel reçoivent un objet SavedStateHandle via son constructeur. Il s'agit d'une carte de valeurs-clés qui vous permettra d'écrire et de récupérer des objets vers et depuis l'état enregistré. Ces valeurs persisteront après l'arrêt du processus par le système et resteront disponibles via le même objet.


Installer

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02' (7 novembre 2019)


Usage

Afin de configurer un ViewModel pour recevoir un SavedStateHandle, vous devez les créer à l'aide d'une fabrique qui étend AbstractSavedStateVMFactory.

SavedStateViewModel vm = new ViewModelProvider(this, new SavedStateVMFactory(this))
        .get(SavedStateViewModel.class);

Après cela, votre ViewModel peut avoir un constructeur qui reçoit un SavedStateHandle:


public class SavedStateViewModel extends ViewModel {
    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }
    ...
}

Stockage et récupération de valeurs

La classe SavedStateHandle a les méthodes que vous attendez pour une carte de valeurs-clés:

  • get (touche chaîne)
  • contient (clé de chaîne)
  • supprimer (touche chaîne)
  • set (clé de chaîne, valeur T)
  • clés()
1
pumnao