AndroidViewModel vs ViewModel


158

Mit der Einführung der Android Architecture Components-Bibliothek wurden mehrere neue Klassen eingeführt, darunter AndroidViewModelund ViewModel. Ich habe jedoch Probleme, den Unterschied zwischen diesen beiden Klassen herauszufinden. Die Dokumentation beschreibt kurz AndroidViewModelund bündig wie folgt:

Anwendungskontext bewusst ViewModel

Ich schätze die Kürze, aber was genau bedeutet das? Wann sollten wir uns für die Verwendung von AndroidViewModelover ViewModelund umgekehrt entscheiden?

Antworten:


222

AndroidViewModel bietet Anwendungskontext

Wenn Sie den Kontext in Ihrem Viewmodel verwenden müssen, sollten Sie AndroidViewModel (AVM) verwenden, da es den Anwendungskontext enthält. So rufen Sie den Kontextaufruf abgetApplication()Verwenden Sie andernfalls das reguläre ViewModel (VM), .

AndroidViewModel hat Anwendungskontext . Wir alle wissen, dass eine statische Kontextinstanz böse ist, da sie Speicherlecks verursachen kann !! Eine statische Anwendungsinstanz ist jedoch nicht so schlecht, wie Sie vielleicht denken da die laufende Anwendung nur eine Anwendungsinstanz enthält.

Daher ist die Verwendung und Verwendung einer Anwendungsinstanz in einer bestimmten Klasse im Allgemeinen kein Problem. Wenn jedoch eine Anwendungsinstanz auf sie verweist, liegt ein Problem aufgrund des Referenzzyklusproblems vor.

Siehe auch Informationen zur Anwendungsinstanz

AndroidViewModel Problematisch für Unit-Tests

AVM bietet einen Anwendungskontext, der für Unit-Tests problematisch ist. Unit-Tests sollten sich nicht mit dem Android-Lebenszyklus wie dem Kontext befassen.


40
Warum nicht immer AndroidViewModel verwenden? Möglicherweise benötigen Sie den Kontext später, auch wenn Sie ihn jetzt nicht benötigen. Hat das einen Nachteil?
T. Rex

18
@ T.Rex Wenn Sie sich den Code ansehen, wird er ViewModelnur durch ein Feld erweitert, das auf Application zeigt. Wenn ich es nicht brauche, mag ich es nicht, einen obligatorischen Konstruktor mit ApplicationParametern zu haben (was AndroidViewModelerfordert) und benutze ihn einfach ViewModel. Wenn ich in Zukunft einen Kontext brauche, kann ich ihn dann leicht ändern.
Junge

3
Verwenden ViewModelSie diese Option, wenn Sie sie mit Fragment verwenden oder ViewModelzwischen verschiedenen Fragmenten derselben Aktivität freigeben möchten .
Codelearner

21
@ T.Rex würde nicht verwenden AndroidViewModel- wobei Context-abhängigen - es unmöglich machen , es in einem regulären Unit - Test zu testen, nur Instrumentierung Tests als Möglichkeit zu verlassen? Ich habe selbst (noch) nicht damit gespielt, es ist nur ein Gedanke
Konrad Morawski

2
AndroidViewModel und ViewModel sind identisch. Der einzige Unterschied besteht darin, dass AndroidViewModel den Anwendungskontext enthält. Sie können ViewModel verwenden und den Kontext an ViewModel übergeben, um das Laden von Daten aus MediaStore zu ermöglichen, oder AndroidViewModel mit Anwendungskontext verwenden.
Alex

9

Endlich habe ich eine einfachere Erklärung bekommen, ein bisschen ...... ... Die AndroidViewModel-Klasse ist eine Unterklasse von ViewModel und ähnlich wie diese dienen sie zum Speichern und Verwalten von UI-bezogenen Daten, die für die Vorbereitung und Bereitstellung von Daten verantwortlich sind für die Benutzeroberfläche und ermöglichen automatisch, dass Daten Konfigurationsänderungen überleben.

Der einzige Unterschied zu AndroidViewModel besteht im Anwendungskontext. Dies ist hilfreich, wenn Sie einen Kontext benötigen, um einen Systemdienst zu erhalten, oder eine ähnliche Anforderung haben. Der fette Text macht es klarer, es zu spüren.



4

AndroidViewModel ist eine Unterklasse von ViewModel . Der Unterschied zwischen ihnen besteht darin, dass wir den Anwendungskontext übergeben können, der verwendet werden kann, wenn der Anwendungskontext erforderlich ist, um beispielsweise die Datenbank im Repository zu instanziieren.

AndroidViewModel ist ein anwendungskontextabhängiges ViewModel.

AndroidViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

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

ViewModel:

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

Sie sollten AndroidViewModel nur verwenden, wenn Sie den Anwendungskontext benötigen.

Sie sollten niemals eine Aktivitätsreferenz oder eine Ansicht, die auf eine Aktivität verweist, im ViewModel speichern. Denn ViewModel ist so konzipiert, dass es eine Aktivität überlebt und Speicherverlust verursacht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.