AndroidViewModel et ViewModel

159

Avec l'introduction de la bibliothèque de composants d'architecture Android, plusieurs nouvelles classes ont été introduites, notamment AndroidViewModelet ViewModel. Cependant, j'ai du mal à comprendre la différence entre ces deux classes. La documentation décrit succinctement AndroidViewModelcomme suit:

Prise en compte du contexte d'application ViewModel

J'apprécie la brièveté, mais qu'est-ce que cela implique exactement? Quand devrions-nous choisir d'utiliser AndroidViewModelover ViewModelet vice-versa?

cascal
la source

Réponses:

223

AndroidViewModel fournit le contexte d'application

Si vous devez utiliser le contexte dans votre Viewmodel, vous devez utiliser AndroidViewModel (AVM), car il contient le contexte de l'application. Pour récupérer l'appel de contexte getApplication(), utilisez sinon le ViewModel (VM) normal.

AndroidViewModel a un contexte d'application . Nous savons tous qu'avoir une instance de contexte statique est maléfique car cela peut provoquer des fuites de mémoire !! Cependant, avoir une instance d'application statique n'est pas aussi mauvais que vous pourriez le penser car il n'y a qu'une seule instance d'application dans l'application en cours d'exécution.

Par conséquent, utiliser et avoir une instance d'application dans une classe spécifique n'est pas un problème en général. Mais, si une instance d'application y fait référence, c'est un problème en raison du problème du cycle de référence.

Voir aussi à propos de l'instance d'application

AndroidViewModel Problématique pour les tests unitaires

AVM fournit un contexte d'application qui pose problème pour les tests unitaires. Les tests unitaires ne doivent traiter aucun élément du cycle de vie Android, tel que le contexte.

Alex
la source
42
Pourquoi ne pas toujours utiliser AndroidViewModel alors? vous pourriez avoir besoin plus tard du contexte même si vous n'en avez pas besoin maintenant. Y a-t-il un inconvénient à cela?
T. Rex
20
@ T.Rex Si vous regardez le code, il s'étend ViewModelavec juste un champ pointant vers Application. Si je n'en ai pas besoin, je n'aime pas avoir un constructeur obligatoire avec Applicationparamètre (qui AndroidViewModelnécessite) et plutôt simplement utiliser ViewModel. Quand j'ai besoin d'un contexte dans le futur, je peux facilement le changer.
Garçon
3
À utiliser ViewModellorsque vous souhaitez l'utiliser avec Fragment ou pour partager ViewModelentre différents fragments de la même activité.
codelearner
22
@ T.Rex n'utiliserait pas AndroidViewModel- étant Context-dépendant - il serait impossible de le tester dans un test unitaire régulier, ne laissant que des tests d'instrumentation comme une possibilité? Je n'ai pas joué avec moi-même (encore), c'est juste une pensée
Konrad Morawski
2
AndroidViewModel et ViewModel sont identiques, la seule différence est qu'AndroidViewModel contient le contexte de l'application. Vous pouvez utiliser utiliser ViewModel et pour passer le contexte à ViewModel pour faire fonctionner ce chargement de données à partir de MediaStore, ou utiliser AndroidViewModel avec le contexte d'application.
Alex
10

Enfin, j'ai quelque chose d'une explication plus simple, un peu ...... ... La classe AndroidViewModel est une sous-classe de ViewModel et similaire à eux, ils sont conçus pour stocker et gérer les données liées à l'interface utilisateur sont responsables de préparer et de fournir des données pour l'interface utilisateur et permettre automatiquement aux données de survivre au changement de configuration.

La seule différence avec AndroidViewModel est qu'il est fourni avec le contexte de l'application, ce qui est utile si vous avez besoin d'un contexte pour obtenir un service système ou si vous avez une exigence similaire. le texte en gras permet de le sentir plus clairement.

user9830926
la source
1
source officielle medium.com/androiddevelopers/…
Neeraj Sewani
4

AndroidViewModel est une sous-classe de ViewModel . La différence entre eux est que nous pouvons transmettre le contexte d'application qui peut être utilisé chaque fois que le contexte d'application est requis, par exemple pour instancier la base de données dans le référentiel.

AndroidViewModel est un ViewModel sensible au contexte d'application.

AndroidViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

VoirModèle:

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

Vous devez utiliser AndroidViewModel uniquement lorsque vous avez besoin d'un contexte d'application.

Vous ne devez jamais stocker une référence d'activité ou une vue qui fait référence à une activité dans le ViewModel, car ViewModel est conçu pour survivre à une activité et entraînera une fuite de mémoire.

John
la source