ViewModel数据复用原理电子书上有个说法有点疑问
来源:1-2 课程介绍及学习指导

默小铭
2021-11-17
ViewModel 在不使用SavedState 的前提下,
存储的数据,仅仅只能当页面因为配置变更导致的销毁再重建时可复用。复用的是ViewModel的实例对象整体,
原理是当配置变更时将数据保存到ActivityThread里面去,当页面恢复时,ActivityThread再把数据传回到宿主页面去,这个说法没什么问题,
//$ComponentActivity.onRetainNonConfigurationInstance()
//因系统原因页面被回收时,会触发该方法, viewModelStore对象会被存储在ActivityThread中。
//在页面恢复重建时,会再次把这个object对象传递到Activity中。
//那么我们就知道页面从销毁到恢复其实用的还是原来的这个ViewModel实例
public final Object onRetainNonConfigurationInstance() {
// Maintain backward compatibility.
Object custom = onRetainCustomNonConfigurationInstance();
ViewModelStore viewModelStore = mViewModelStore;
if (viewModelStore == null) {
// No one called getViewModelStore(), so see if there was an existing
// ViewModelStore from our last NonConfigurationInstance
NonConfigurationInstances nc =
(NonConfigurationInstances) getLastNonConfigurationInstance();
if (nc != null) {
viewModelStore = nc.viewModelStore;
}
}
if (viewModelStore == null && custom == null) {
return null;
}
//NonConfigurationInstances 对象就是在这创建的
NonConfigurationInstances nci = new NonConfigurationInstances();
nci.custom = custom;
nci.viewModelStore = viewModelStore;
return nci;
}
但电子书上 ComponentActivity.onRetainNonConfigurationInstance() 这个注释写的这个方法触发时机是 “因系统原因页面被回收时”,这个说法怎么又跟 SavedSate 感觉重复了呢?
SavedSate 的说法是: 存储的数据,无论是配置变更、还是因内存不足、电量不足等系统原因导致页面被回收再重建。都可以复用
那么 onRetainNonConfigurationInstance() 这个触发时机到底是什么场景,就这个搞得有点蒙
写回答
1回答
-
SavedState数据存储与恢复本质是利用了onSaveIntanceState的时机。只有当内存不足电量不足时会触发,数据可以临时保存到savedState 中。
viewmodel 的数据存储与恢复是利用了onRetainNonconfigurstion方法的调用时机,只有当是因为配置变更页面被回收才会触发
012021-11-20
相似问题