Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vinculación de vista
El ciclo de vida de
Biblioteca de vinculación de un ViewModel
datos
Cómo compartir
' Componentes optimizados datos entre
para ciclos de vida
Desarrolladores de Android # Documentos # Guías ¿Te resultó útil?
fragmentos
Biblioteca de Paging
'
Bibliotecas de capas de datos El framework de Android administra los ciclos de vida de los controladores de IU, como las actividades y los
fragmentos. El marco de trabajo podría decidir destruir o recrear un controlador de IU como respuesta a acciones del
' ' '
Inserción de dependencias Si el sistema destruye o recrea un controlador de IU, se perderán todos los datos relacionados con la IU que almacenes
en el controlador. Por ejemplo, tu app podría incluir una lista de usuarios en una de sus actividades. Cuando se recrea la
actividad para un cambio de conTguración, la actividad nueva tiene que volver a recuperar la lista de usuarios. En el caso
de los datos simples, la actividad puede usar el método onSaveInstanceState() y restablecer sus datos a partir del
paquete en onCreate() , aunque este enfoque solo es apto para pequeñas cantidades de datos que se pueden
serializar y deserializar, no para cantidades de datos posiblemente grandes, como una lista de usuarios o mapas de bits.
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
Otro problema es que los controladores de IU frecuentemente necesitan hacer llamadas asíncronas que podrían tardar
en devolverse. El controlador de IU necesita administrar estas llamadas y garantizar que el sistema las borre después de
su destrucción para evitar potenciales pérdidas de memoria. Esta administración requiere mucho mantenimiento y, en
los casos en que se recrea el objeto para un cambio de conTguración, es una pérdida de recursos, ya que el objeto
quizás deba volver a emitir llamadas que ya hizo.
Los controladores de IU, como las actividades y los fragmentos, tienen como objetivo principal mostrar datos de IU,
reaccionar a las acciones de los usuarios o administrar la comunicación del sistema operativo, como las solicitudes de
permisos. Si se establece que los controladores de IU también sean responsables de cargar datos de una red o base de
datos, la clase estará sobrecargada. Asignar demasiadas responsabilidades a los controladores de IU puede provocar
que una sola clase trate de administrar todo el trabajo de una app por su cuenta, en lugar de delegar el trabajo a otras
clases. Si asignas demasiadas responsabilidades a los controladores de IU de este modo, la prueba también se diTculta
considerablemente.
Es más fácil y eTciente separar la propiedad de los datos de visualización de la lógica del controlador de IU.
Kotlin Java
%&
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
' ' '
return users;
}
Kotlin Java
}
}
Si se vuelve a crear la actividad, recibe la misma instancia de MyViewModel que creó la primera actividad. Cuando
Tnaliza la actividad del propietario, el framework llama al método onCleared() de los objetos ViewModel para que
borre los recursos.
" Precaución: Un ViewModel nunca debe hacer referencia a una vista, a un Lifecycle o a cualquier clase que pueda hacer
referencia al contexto de la actividad.
Los objetos ViewModel están diseñados para sobrevivir a instancias especíTcas de vistas o LifecycleOwners . Este
diseño también te permite escribir pruebas para abarcar un ViewModel con mayor facilidad, ya que no sabe acerca de
los objetos de vista y Lifecycle . Los objetos ViewModel pueden contener LifecycleObservers , como objetos
LiveData . Sin embargo, los objetos ViewModel no deben observar cambios en los elementos observables
optimizados para ciclos de vida, como los objetos LiveData . Si el ViewModel necesita el contexto de Application ,
por ejemplo, para buscar un servicio del sistema, puede extender la clase AndroidViewModel y hacer que un
constructor reciba la Application , ya que la clase Application extiende Context .
La Tgura 1 muestra los estados del ciclo de vida de una actividad a medida que atraviesa una rotación y hasta que
termina. La ilustración también muestra el ciclo de vida del ViewModel junto al de la actividad asociada. Este diagrama
en particular muestra los estados de una actividad. Los mismos estados básicos se aplican al ciclo de vida de un
fragmento.
Por lo general, solicitas un ViewModel la primera vez que el sistema llama al método onCreate() del objeto de una
actividad. El sistema puede llamar a onCreate() varias veces durante la vida de una actividad, como cuando rota la
pantalla de un dispositivo. El ViewModel existe desde la primera vez que solicitas un ViewModel hasta que Tnaliza la
actividad y se destruye.
Se puede abordar este punto problemático común usando objetos ViewModel . Esos fragmentos pueden compartir un
ViewModel mediante su alcance de actividad para administrar esta comunicación, como se indica en el siguiente
código de muestra:
Kotlin Java
Ten en cuenta que ambos fragmentos recuperan la actividad que los contiene. De esa manera, cuando cada fragmento
obtiene el ViewModelProvider , reciben la misma instancia de SharedViewModel , cuyo alcance está determinado por
esta actividad.
Los fragmentos no necesitan saber acerca del otro, excepto por el contrato de SharedViewModel . Si uno de los
fragmentos desaparece, el otro sigue funcionando como de costumbre.
Cada fragmento tiene su propio ciclo de vida y no se ve afectado por el ciclo de vida del otro. Si un fragmento
reemplaza al otro, la IU continúa funcionando sin problemas.
En un enfoque común con respecto al uso de cargadores, una app podría usar un CursorLoader para observar el
contenido de una base de datos. Cuando un valor en la base de datos cambia, el cargador activa automáticamente una
nueva carga de los datos y actualiza la IU.
ViewModel funciona con Room y LiveData para reemplazar el cargador. El ViewModel garantiza que los datos
sobrevivan al cambio de conTguración del dispositivo. Room informa sobre tu LiveData cuando cambia la base de
datos, y LiveData, a su vez, actualiza la IU con los datos revisados.
Más información
A medida que los datos se hacen más complejos, quizás decidas tener una clase por separado solo para cargar los
datos. El objetivo de ViewModel es encapsular los datos para un controlador de IU a Tn de que estos sobrevivan a los
cambios de conTguración. Si quieres obtener más información para cargar, conservar y administrar datos durante
cambios de conTguración, consulta Cómo guardar estados de IU.
La Guía para la arquitectura de apps de Android sugiere crear una clase de repositorio para administrar estas funciones.
Recursos adicionales
Para obtener más información sobre la clase ViewModel , consulta los siguientes recursos.
Ejemplos
Sunbower, una app de jardinería que ilustra las prácticas recomendadas de desarrollo de Android con
Android Jetpack
Codelabs
Blogs
Videos
Android Jetpack: ViewModel
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks
of Oracle and/or its aeliates.
KitKat
Privacidad | Licencia | Lineamientos de marca Recibe noticias y sugerencias por correo electrónico Suscribirse Language
)