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?
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.
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.
¿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.
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.
ViewModel
con solo un campo que apunta a Aplicación. Si no lo necesito, no me gusta tener un constructor obligatorio conApplication
parámetro (queAndroidViewModel
requiere) y simplemente usarloViewModel
. Cuando necesito un contexto en el futuro, entonces puedo cambiarlo fácilmente.ViewModel
cuando quiera usarlo con Fragment o para compartirViewModel
entre diferentes fragmentos de la misma Actividad.AndroidViewModel
, al serContext
dependiente, ¿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 pensamientoFinalmente 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.
fuente
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:
ViewModel:
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.
fuente