Lifecycle

ViewModel

简述:fragmentcomponentActivity实现了ViewModelStoreOwner接口,实现该接口方法getViewModelStore(),当调用ViewModelProvider(ViewModelStoreOwner owner).get(Class<T> modelClass)时,会使用工厂模式创建viewModel,之后将其以canonicalName(全限定名)为key存入mViewModelStore中,ViewModelStore内部是个HashMap<String, ViewModel>

当屏幕旋转或切换系统语言等配置修改的行为发生时,Activity 生命周期从销毁再重建,在销毁时(系统杀死或配置修改),如果判断系统配置没有变化(即!isChangingConfigurations)清空保存的ViewModel(即 getViewModelStore().clear();

如果发生变化则调用onRetainNonConfigurationInstance() 方法将 viewModelStore 保存起来,当Activity重建时则从getLastNonConfigurationInstance()中获取保存的mViewModelStore

ps:如果ViewModelProvider传入Activity,则取得是Activity的ViewModelStore,如果传入了fragment,则根据以下代码取ViewModelStore,即先取父fragment的FragmentManager的ViewModelStore,再取hostActivty的ViewModelStore,最后才是新建一个。

Read more

LiveData

简述:

数据实时更新、安全更新:当liveData的setValue被调用时,会遍历自身所有observer并considerNotify,此时会判断observer的活跃状态(shouldBeActive)和内部版本,决定是否向其发送通知。

避免内存泄漏:传入lifeCycleOwner即走observe()的LiveData会在lifeCycleOwner回调onStateChanged为DESTROYED的时候移除掉observer防止内存泄露,而相对的observeForever则由于没有owner而无此特性。

解决Configuration Change问题、粘性数据:一般而言observer是在onCreate中调用的,liveData.observer方法在调用时也会立即被推送liveData中最后一次数据。(会导致所谓的数据倒灌)。Configuration Change时会ViewModel会从当前Activity或fragmentManager的viewModelStore的缓存中重新取出,而ViewModel中的liveData自然也会保留。

https://zhuanlan.zhihu.com/p/593472898

Featrue

  • UI和实时数据保持一致 因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获得通知,更新UI。

  • 避免内存泄漏 观察者被绑定到组件的生命周期上,当被绑定的组件销毁(destroy)时,观察者会立刻自动清理自身的数据。

  • 不会再产生由于Activity处于stop状态而引起的崩溃,例如:当Activity处于后台状态时,是不会收到LiveData的任何事件的。

  • 不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化。

  • 实时数据刷新 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据。

  • 解决Configuration Change问题 在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据。

Read more