android ViewModel学习

本文章需要回答的几个问题 吧 吗

  1. 如何使用,直接new?还是其他方式?
  2. viewModel为什么不能持有activity
  3. viewModel的特点是什么

官方链接,戳这里ViewModel 概览 | Android 开发者 | Android Developers (google.cn)
官方写的都比较全了,
上面的三个问题也都囊括了,概况一下

  1. 一般使用如下方式
//这样这个viewModel的作用域就取决于this,也就是ViewModelStoreOwner,不受配置的变化影响
 new ViewModelProvider(this).get(MyViewModel.class);
  1. 因为viewModel的作用域可能要长于activity 如果持有,会有内存泄漏问题,比如发生了旋转 配置发生变化了,调用了destory,此时activity重新创建,这个时候如果持有,就会有内存泄露的问题i
  2. 特点

数据保留,Activity配置变化时(比如屏幕旋转,切换语言)保留数据
UI组件(Activity与Fragment、Fragment与Fragment)间实现数据共享,可以解决多个fragment数据共享问题

至于如何保留数据,其实实在configuration变化时,ActivityThread进行preformDestoryActivity时先进行数据保存即 retainNonConfigurationInstances,这个会调用ComponentActivity的onRetainNonConfigurationInstance,进行数据保存

@Nullable
    @SuppressWarnings("deprecation")
    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 nci = new NonConfigurationInstances();
        nci.custom = custom;
        //保存了 viewModel,不会丢失
        nci.viewModelStore = viewModelStore;
        return nci;
    }

当Activity被重新relaunch的时候,就会进行数据恢复,这个实在Activity的attach的时候

activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback,
                        r.assistToken, r.shareableActivityToken);

                if (customIntent != null) {
                    activity.mIntent = customIntent;
                }
                //attach之后,会进行清空处理
                r.lastNonConfigurationInstances = null;

至此,这个链路结束

你可能感兴趣的:(android ViewModel学习)