viewmodel的作用:
1.管理UI数据,如activity或者fragment。利于他们的解藕,只专注他们控制器类的作用。 2.感知lifecycle的生命周期,避免crash发生。 3.当配置发生改变,可以防止数据的丢失,省去了开发人员的工作。 4.实现fragment与fragment,activity与fragment之间的数据共享。 5.可以取代eventbus,更有效的实现集成总线的机制。
生命周期长于activity,因屏幕旋转等配置发生改变需要重新创建activity后,viewmodel对象依然会保留,只有activity真正finish时viewmodel才会被清除。
不能在oncreate之前获取viewmodel,因为viewmodelstore是在activity父类oncreate方法创建。
viewmodel不能持有activity或者fragment的引用,因为viewmodel生命周期更长。viewmodel更新UI层数据需要用到基于观察者模式的livedata。
调用viewModelProvider.get(UserViewModel.class)获取viewmodel,会先尝试从viewmodelstore中获取,如果获取不到再创建,创建成功会保存在viewmodelstore中。
viewmodel几个关键的类:
newinstancefactory(实现factory接口,通过反射的方式创建viewmodel);
viewmodelstore(内部封装了hashmap存储viewmodel,有clear方法清除循环清除viewmodel);
viewmodelstoreowner,是个接口,提供了创建viewmodelstore的方法,activity和fragment实现了该接口,并实现获取viewmodelstore的方法,如果存储器是空,就先尝试从lastNonConfigurationInstance获取,获取不到再创建一个:这里解释了activity配置发生改变数据不丢失;
saveInstanceState只能存储少量的数据,bundle大小1M,而viewmodel可以存储大量的数据。viewmodel不能取代saveInstanceState。