AndroidViewModel vs ViewModel


159

Con l'introduzione della libreria Android Architecture Components, sono state introdotte diverse nuove classi, tra cui AndroidViewModele ViewModel. Tuttavia, ho difficoltà a capire la differenza tra queste due classi. La documentazione descrive brevemente AndroidViewModelcome segue:

Conoscenza del contesto dell'applicazione ViewModel

Apprezzo la brevità, ma cosa implica esattamente? Quando dovremmo scegliere di utilizzare AndroidViewModelover ViewModele viceversa?

Risposte:


223

AndroidViewModel fornisce il contesto dell'applicazione

Se è necessario utilizzare il contesto all'interno di Viewmodel, è necessario utilizzare AndroidViewModel (AVM), poiché contiene il contesto dell'applicazione. Per recuperare la chiamata di contesto getApplication(), utilizzare altrimenti il ​​normale ViewModel (VM).

AndroidViewModel ha un contesto applicativo . Sappiamo tutti che avere un'istanza di contesto statico è male poiché può causare perdite di memoria !! Tuttavia, avere un'istanza dell'applicazione statica non è così male come si potrebbe pensare perché esiste solo un'istanza dell'applicazione nell'applicazione in esecuzione.

Pertanto, l'utilizzo e l'istanza dell'applicazione in una classe specifica non è un problema in generale. Ma se un'istanza dell'applicazione fa riferimento a loro, è un problema a causa del problema del ciclo di riferimento.

Vedi anche sull'istanza dell'applicazione

AndroidViewModel Problematico per unit test

AVM fornisce un contesto applicativo problematico per i test unitari. I test unitari non dovrebbero occuparsi del ciclo di vita di Android, come il contesto.


42
Perché non usare sempre AndroidViewModel allora? in seguito potresti aver bisogno del contesto anche se non ti serve ora. C'è qualche aspetto negativo in questo?
T. Rex,

20
@ T.Rex Se guardi il codice, si estende ViewModelcon solo un campo che punta all'applicazione. Se non ne ho bisogno, non mi piace avere un costruttore obbligatorio con Applicationparametro (che AndroidViewModelrichiede) e piuttosto semplicemente usare ViewModel. Quando in futuro avrò bisogno di un contesto, posso facilmente cambiarlo.
Ragazzo,

3
Utilizzare ViewModelquando si desidera utilizzarlo con Frammento o per condividere ViewModeltra diversi frammenti della stessa Attività.
studente del codice

22
@ T.Rex non userebbe AndroidViewModel- essendo Context-dipendente - renderebbe impossibile testarlo in un normale test unitario, lasciando solo test di strumentazione come possibilità? Non ci ho giocato da solo (ancora), è solo un pensiero
Konrad Morawski,

2
AndroidViewModel e ViewModel è lo stesso, l'unica differenza è che AndroidViewModel contiene il contesto dell'applicazione. È possibile utilizzare ViewModel e passare il contesto a ViewModel per eseguire il caricamento dei dati da MediaStore oppure utilizzare AndroidViewModel con il contesto dell'applicazione.
Alex,

10

Finalmente ho ottenuto una spiegazione più semplice, un po '... per l'interfaccia utente e consentire automaticamente ai dati di sopravvivere alla modifica della configurazione.

L'unica differenza con AndroidViewModel è che viene fornito con il contesto dell'applicazione, il che è utile se è necessario il contesto per ottenere un servizio di sistema o avere un requisito simile. il testo in grassetto rende più chiaro il senso.



4

AndroidViewModel è una sottoclasse di ViewModel . La differenza tra loro è che possiamo passare il contesto dell'applicazione che può essere utilizzato ogni volta che è necessario il contesto dell'applicazione per creare un'istanza del database nel repository.

AndroidViewModel è un ViewModel sensibile al contesto dell'applicazione.

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();
}

È necessario utilizzare AndroidViewModel solo quando è necessario il contesto dell'applicazione.

Non si dovrebbe mai archiviare un riferimento di attività o una vista che fa riferimento a un'attività in ViewModel. Perché ViewModel è progettato per sopravvivere a un'attività e causerà perdita di memoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.