Lifecycle

ViewModel

ViewModel的原理是系统配置更改情况下在onDestroy时Actvitity中保存ViewModel的viewModelStore并不会被销毁(非配置更改的情况会销毁viewModelStore)。重建后在获取ViewModel时会根据传入的类全限定名从ViewModelStore中取;

上述并不能针对内存不足而Activity被回收的情况下生效,针对内存不足回收activity的情况,需要手动在onSaveInstanceState中存

之后手动在onRestoreInstanceState中取,或者是使用SavedStateHandle封装了这个过程

简述: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持有一个版本,observer持有一个版本,当livedata.setValue时,如果observer的版本低于livedata版本并且observer是活跃状态时,observer的onchange才会被调用

另外lifeCycleOwner在切换到活跃态时会给observer发送最新数据,以及在切换到DESTROYED时会移除observer

还有就是粘性数据

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

Featrue

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

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

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

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

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

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

Read more