Android – Jetpack – Hacer que la clase creada perezosamente sea consciente del ciclo de vida.
Tengo un caso interesante para resolver.
Antecedentes
Tengo un ViewModel que es un LifecycleObserver, sigo un buen patrón arquitectónico en el que este VM sirve la lógica global de la pantalla y compone VMs más pequeños dentro para servir a los componentes que están en la pantalla.
Para que estos VM más pequeños funcionen sin problemas, los hago conscientes del ciclo de vida en el onCreate del ViewModel del contenedor.
kotlin
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
smallerVMs.forEach(owner.lifecycle::addObserver)
}
Problema
Sin embargo, tengo n otros pequeños VMs que instanciaré según una llamada a API.
Como no tengo referencia de ellos hasta que se instancian, no puedo hacerlos conscientes del ciclo de vida en onCreate como se mencionó anteriormente. Y cuando la API regresa con resultados y los instancio, ¡no tengo conocimiento de la instancia de LifecycleOwner!
Pensé en cachear el LifecycleOwner en onCreate, pero eso significa mantener una referencia a la Vista en un VM, lo cual no es una buena práctica en MVVM.
¿Algún pensamiento al respecto?
Gracias de antemano!
Descargo de responsabilidad: tener los VM más pequeños dentro del gran VM es esencial, ya que los VM más pequeños son piezas de presentación reutilizables en toda la aplicación.
davy.ai
Solución posible
Una manera de resolver este problema es utilizar un
LifecycleObserver
personalizado para las VMs más pequeñas que pueda manejar el caso en que elLifecycleOwner
no esté disponible. Este observador personalizado puede usar unHandler
para publicar las actualizaciones a las VMs más pequeñas cuando elLifecycleOwner
esté disponible.Aquí hay un ejemplo de cómo se podría implementar:
LifecycleObserver
personalizado para las VMs más pequeñas que implementeHandler.Callback
:ViewModel
del contenedor, cree una instancia deSmallViewModelObserver
y regístrela como unLifecycleObserver
:SmallViewModelObserver
:Este enfoque utiliza un
Handler
para publicar las actualizaciones a las VMs más pequeñas cuando elLifecycleOwner
esté disponible. Esto permite que las VMs más pequeñas se agreguen al ciclo de vida incluso si elLifecycleOwner
no está disponible en el momento de instanciarlas.Tenga en cuenta que este enfoque tiene algunas limitaciones y posibles inconvenientes:
Handler
puede introducir cierto retraso entre el momento en que elLifecycleOwner
esté disponible y el momento en que las VMs más pequeñas se agreguen al ciclo de vida. Este retraso se puede mitigar utilizando unHandlerThread
con alta prioridad.SmallViewModelObserver
es responsable de realizar un seguimiento de las VMs más pequeñas y agregarlas al ciclo de vida. Esto puede hacer que el código sea más complejo y más difícil de mantener.SmallViewModelObserver
puede mantener referencias a VMs más pequeñas que ya no se están utilizando. Esto se puede mitigar eliminando las VMs más pequeñas del observador cuando ya no sean necesarias.