AndroidViewModel vs ViewModel

159

Con la introducción de la biblioteca de Android Architecture Components, se introdujeron varias clases nuevas, incluidas AndroidViewModely ViewModel. Sin embargo, tengo problemas para descubrir la diferencia entre estas dos clases. La documentación describe sucintamente AndroidViewModello siguiente:

Contexto de la aplicación consciente ViewModel

Aprecio la brevedad, pero ¿qué implica esto exactamente? ¿Cuándo deberíamos elegir usar AndroidViewModelover ViewModely viceversa?

cascal
fuente

Respuestas:

223

AndroidViewModel proporciona contexto de aplicación

Si necesita usar el contexto dentro de su Viewmodel, debe usar AndroidViewModel (AVM), porque contiene el contexto de la aplicación. Para recuperar la llamada de contexto getApplication(), use el ViewModel (VM) normal.

AndroidViewModel tiene contexto de aplicación . ¡Todos sabemos que tener una instancia de contexto estático es malo, ya que puede causar pérdidas de memoria! Sin embargo, tener una instancia de aplicación estática no es tan malo como podría pensar porque solo hay una instancia de aplicación en la aplicación en ejecución.

Por lo tanto, usar y tener una instancia de Aplicación en una clase específica no es un problema en general. Pero, si una instancia de la Aplicación hace referencia a ellos, es un problema debido al problema del ciclo de referencia.

Consulte también sobre Instancia de aplicación

AndroidViewModel Problemática para pruebas unitarias

AVM proporciona un contexto de aplicación que es problemático para las pruebas unitarias. Las pruebas unitarias no deben abordar ninguno de los ciclos de vida de Android, como el contexto.

Alex
fuente
42
¿Por qué no usar siempre AndroidViewModel entonces? Es posible que luego necesite el contexto, incluso si no lo necesita ahora. ¿Hay alguna desventaja en eso?
T. Rex
20
@ T.Rex Si observa el código, se extiende ViewModelcon solo un campo que apunta a Aplicación. Si no lo necesito, no me gusta tener un constructor obligatorio con Applicationparámetro (que AndroidViewModelrequiere) y simplemente usarlo ViewModel. Cuando necesito un contexto en el futuro, entonces puedo cambiarlo fácilmente.
Niño
3
Úselo ViewModelcuando quiera usarlo con Fragment o para compartir ViewModelentre diferentes fragmentos de la misma Actividad.
codelearner
22
@ T.Rex no usaría AndroidViewModel, al ser Contextdependiente, ¿imposibilitaría probarlo en una prueba de unidad regular, dejando solo las pruebas de instrumentación como una posibilidad? No he jugado con él (todavía), es solo un pensamiento
Konrad Morawski
2
AndroidViewModel y ViewModel son iguales, la única diferencia es que AndroidViewModel contiene el contexto de la aplicación. Puede usar ViewModel y pasar el contexto a ViewModel para que funcione cargando datos desde MediaStore, o usar AndroidViewModel con el contexto de la aplicación.
Alex
10

Finalmente obtuve algo una explicación más simple, un poco ...... ... La clase AndroidViewModel es una subclase de ViewModel y similar a ellos, están diseñados para almacenar y administrar datos relacionados con la interfaz de usuario son responsables de preparar y proporcionar datos para la interfaz de usuario y automáticamente permite que los datos sobrevivan al cambio de configuración.

La única diferencia con AndroidViewModel es que viene con el contexto de la aplicación, que es útil si necesita contexto para obtener un servicio del sistema o tiene un requisito similar. el texto en negrita hace que sea más claro sentirlo.

usuario9830926
fuente
1
fuente oficial medium.com/androiddevelopers/…
Neeraj Sewani
4

AndroidViewModel es una subclase de ViewModel . La diferencia entre ellos es que podemos pasar el Contexto de la aplicación que se puede usar siempre que se requiera el Contexto de la aplicación, por ejemplo, para crear una base de datos en el repositorio.

AndroidViewModel es un ViewModel de contexto de aplicación.

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

Debe usar AndroidViewModel solo cuando requiera Contexto de aplicación.

Nunca debe almacenar una referencia de actividad o una vista que haga referencia a una actividad en ViewModel. Porque ViewModel está diseñado para sobrevivir a una actividad y provocará una pérdida de memoria.

Juan
fuente