Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Cómo implementar observer en el proyecto

21/32
Recursos

Aportes 6

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Me propuse como reto hacer lo que dice el profesor: que las interfaces sean genéricas para que nosotros podamos usarla con cualquier tipo de dato. Simplemente fue cuestión de modificarlas de esta manera:

interface Observable2<T> {
    fun addObserver(observer: Observer2<T>)
    fun removeObserver(observer: Observer2<T>)
    fun notifyObservers(newValue: T?)
}
interface Observer2<T> {
    fun notifyChange(newValue: T?)
}

También me propuse añadir la funcionalidad de eliminar todos los observers automáticamente cuando el Fragment se destruye, tal y como lo hace LiveData. La clase quedó de esta manera:

class AvailableBalanceObservable<T>(lifecycleOwner: LifecycleOwner) : Observable2<T>
    init {
        lifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun removeAllObservers() {
                amountObserverList.clear()
                lifecycleOwner.lifecycle.removeObserver(this)
            }
        })
    }
    // Resto del código
}

Un LifecycleOwner es una interfaz que implementan todas las clases que tienen un ciclo de vida, en este caso un Fragment, pero también puede ser una Activity. En mi implementación, al iniciar la clase, se añade un observador al ciclo de vida del Fragment. Cuando el Fragment ejecuta onDestroy(), se eliminan todos los observers de la lista y se elimina el propio observer del ciclo de vida.

Finalmente, para construir la clase, basta con llamarla así:

class HomeFragment : Fragment(), HomeContract.View {
    private lateinit var availableBalanceObservable: AvailableBalanceObservable<Double>
    // Resto del código...

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // Resto del código...
        availableBalanceObservable = AvailableBalanceObservable(viewLifecycleOwner)
    }
}

Con estos dos cambios, la clase tiene más funcionalidades y está más cerca a la implementación de LiveData

Ciclo de Vida de Una Actividad

O pueden verlo mas detallado aquí 😉

Los eventos del observable deberían delegarse al Presenterya que a la vista (fragment o activity) no debe tener conocimiento de esta lógica. Cuando se observe un cambio, este se notifica a la vista a través del mismo Presenter.

Es muy importante tener en cuenta que estas dos interfaces tienen una continua comunicacion en andorid nuestras activities tienen un ciclo de vida volatil (el OS destruye actividades que estan en segundo plano para optimizar recursos)al momento de llamar al metodo onDestroy es una muy buena practica desuscribirme de todos los eventos de ese observable.

“$ $newValue” el primer simbolo de dolar es string para mostrarlo el segundo para mostrar el valor de la variable

Buenas practicas