解决问题:1. Activity的销毁和重建过程中的数据保存。2. 逻辑层持有UI层管理网络请求,避免内存泄漏。
ViewModel与Activity/Fragment的生命周期绑定,不会出现内存泄露的问题。
ViewModelStoreOwner是一个接口,唯一的方法是
getViewModelStore
,由Activity/Fragment实现。当Activity/Fragment因为配置触发重建时,ViewModel的数据不会丢失,依然可以获取。原因:因为创建ViewModel时,都会去ViewModelStore中寻找对应的ViewModel,如果没有找到ViewModel就会新创建一个,并保存在ViewModelStore中。所以当触发重建时,在ViewModelStore中可以获取到对应的ViewModel。而ViewModelStore存储在
NonConfigurationInstances
中,该对象不会受Activity销毁重建的影响,所以ViewModel的数据可以保存。(NonConfigurationInstances
这个对象存储在ActivityThread中,参考Activity启动流程,该对象不会受到Activity销毁和重建的影响)ViewModel的销毁,通过监听Activity的onDestroy事件,判断如果是正常销毁,就clear ViewModelStore,如果是因为修改配置导致的销毁,那就不会clear
Activity和Fragment可以通过ViewModel共享数据的原理是什么?
1. 因为Fragment声明ViewModel时,可以设置ViewModelStore为Fragment的ViewModelStore或者是requireActivity()的ViewModelStore,如果是使用的requireActivity的ViewModelStore,意味着跟Activity使用的是同一个ViewModelStore,而且因为key
相同,所以使用的实际上是同一个ViewModel实例,所以可以进行数据共享。
参考资料:
https://juejin.cn/post/6915012483421831175
https://juejin.cn/post/6873356946896846856
https://juejin.cn/post/6951244272553181197