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回答

LovelyChubby

2021-11-20

SavedState数据存储与恢复本质是利用了onSaveIntanceState的时机。只有当内存不足电量不足时会触发,数据可以临时保存到savedState 中。

viewmodel 的数据存储与恢复是利用了onRetainNonconfigurstion方法的调用时机,只有当是因为配置变更页面被回收才会触发

0
1
默小铭
非常感谢!
2021-11-20
共1条回复

开发商业级热门短视频App 掌握Jetpack组件库

Jetpack架构大揭秘,全组件实战主流且功能完整的短视频App

1364 学习 · 607 问题

查看课程