transformations studio room livedata example data combine android android-architecture-components android-livedata android-viewmodel

android - studio - Observando LiveData desde ViewModel



mutable live data android (2)

Tengo una clase separada en la que manejo la obtención de datos (específicamente Firebase) y generalmente le devuelvo objetos LiveData y los actualizo de forma asíncrona. Ahora quiero tener los datos devueltos almacenados en un ViewModel, pero el problema es que para obtener dicho valor, necesito observar el objeto LiveData devuelto desde mi clase de obtención de datos. El método de observación requería un objeto LifecycleOwner como primer parámetro, pero obviamente no tengo eso dentro de mi ViewModel y sé que no debo mantener una referencia a la Actividad / Fragmento dentro de ViewModel. ¿Qué tengo que hacer?


En esta publicación del blog del desarrollador de Google, José Alcérreca, se recomienda utilizar una transformación en este caso (consulte el párrafo "LiveData en repositorios").


En la documentación de ViewModel

Sin embargo, los objetos de ViewModel nunca deben observar cambios en los observables que tienen en cuenta el ciclo de vida, como los objetos LiveData.

Otra forma es que los datos implementen RxJava en lugar de LiveData, entonces no tendrá la ventaja de ser consciente del ciclo de vida.

En la muestra de google de todo-mvvm-live-kotlin , usa una devolución de llamada sin LiveData en ViewModel.

Supongo que si desea cumplir con toda la idea de ser un software de ciclo de vida, necesitamos mover el código de observación en Actividad / Fragmento. Si no, podemos usar la devolución de llamada o RxJava en ViewModel.

Otro compromiso es implementar MediatorLiveData (o Transformaciones) y observar (ponga su lógica aquí) en ViewModel. Note que el observador MediatorLiveData no se activará (igual que Transformaciones) a menos que se observe en Actividad / Fragmento. Lo que hacemos es poner una observación en blanco en la Actividad / Fragmento, donde el trabajo real se realiza en ViewModel.

// ViewModel fun start(id : Long) : LiveData<User>? { val liveData = MediatorLiveData<User>() liveData.addSource(dataSource.getById(id), Observer { if (it != null) { // put your logic here } }) } // Activity/Fragment viewModel.start(id)?.observe(this, Observer { // blank observe here })

PD: leí ViewModels y LiveData: Patterns + AntiPatterns que sugería Transformaciones. No creo que funcione a menos que se observe el LiveData (que probablemente requiera que se haga en la Actividad / Fragmento).