lifecycle与观察者模式
Android中的lifecycle机制,主要是使用观察者模式,来实现liveData能够感应指定页面生命周期的
也就是说,Activity作为被观察者,他管理了与他关联的观察者,在生命周期发生变化的时候,通知观察者们作出反应。也就是调用观察者的函数
观察者模式成员
先撇开Activity,了解一下相关成员
LifecycleOwner:是被观察者接口,要求持有Lifecycle类对象
Lifecycle:抽象类,内部管理观察者
LifecycleRegistry:Lifecycle的实现类,也就是被观察者的具体实现。他需要管理观察者,分发事件到观察者,或者说调用观察者的函数
LifecycleObserver:观察者的接口类
在Activity中的使用
在Activity中,通过追踪ComponentActivity源码发现,它实现了LifecycleOwner接口,持有了自己的LifecycleRegistry
那么它是如何让LifecycleRegistry与自己的生命周期关联起来的呢?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ReportFragment.injectIfNeededIn(this)
}
核心在ReportFragment.injectIfNeededIn(this)
ReportFragment 的主要作用是通过向 Activity 中注入一个无界面的 Fragment,实现对 Activity 生命周期的监听,并将事件传递到 Lifecycle 实例(如 LifecycleRegistry)进行处理
进入ReportFragment追踪代码,就看到它在自己的生命周期函数中,将事件分发给了activity.lifecycle来处理。其实就是交给LifecycleRegistry处理
FragmentActivity
在FragmentActivity中,就直接交给自己的LifecycleRegistry处理生命周期事件了
LifecycleRegistry处理生命周期,进行传递
他进行了生命周期的检查,以及是否需要更新等判断,最终,通过
observer.dispatchEvent(lifecycleOwner, event)
....
....
lifecycleObserver.onStateChanged(owner!!, event)
将生命周期Event事件传递到observer
与Livedata使用
在activity中使用livedata.observe(this){...}时
LiveData内部构建了观察者LifecycleBoundObserver类型实例,添加到了Activity的LifecycleRegistry。所以LifecycleRegistry传递生命周期Event会传递给它
LifecycleBoundObserver的onStateChanged函数中,就处理了不同生命周期的时候,自己如何处理自己的Observer
liveData的observer
在activity中使用livedata.observe(this){...}时
第二个参数就是liveData的observer,此时livedata是被观察者,观察者要观察livedata的数据变化
所以livedata也是一种观察者模式。它的setValue和postValue就是通知观察者要进行更新了
setValue是同步
postValue在异步时使用