JetPack初探之ViewModel

JetPack初探之ViewModel

简介

  • 官方介绍:
    ViewModel is a class that is responsible for preparing and managing the data foran Activity} or a {@link androidx.fragment.app.Fragment Fragment}.
    It also handles the communication of the Activity / Fragment with the rest of the application
    (e.g. calling the business logic classes).
  • 直译:
    ViewModel是一个负责为Activity或Fragment准备和管理数据的类。它还处理Activity / Fragment与应用程序其余部分的通信

viewModel使用

  • 创建MyViewModel()类,让它继承ViewModel()。
  • 在Activity/Fragment中使用val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java),获取到viewModel实例。
    viewModel可以用来存储与viewModel绑定的view层的数据,如果在使用viewModel期间,将设备旋转(横屏/竖屏),view层会被重新创建,但是viewModel会继续被新创建的view持有。
    以上是对viewModel的最基本创建及使用,如果需要更加仔细的则需要在viewModel中配合LiveData或其他Jetpack组件。

源码探究

1.ViewModel()的创建:在MyViewModel()类中Ctrl+右键,进入ViewModel(),在ViewModel类中,官方给了viewModel的简介,使用方法,以及使用viewModel在fragment之间进行数据交互
然后看onCleared()方法,当你的viewModel不再使用时会调用这个方法

2.然后是ViewModelProviders()类中有4个of方法,他们的作用都是:创建一个ViewModelProvider,他能在fragment/Activity给定的生命周期内保存ViewModel。

//这儿只举例fragment
public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
        Application application = checkApplication(checkActivity(fragment));
        if (factory == null) {
        	//获取AndroidViewModelFactory
        	//AndroidViewModelFactory作用:创建AndroidViewModel和ViewModel,
            factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        //fragment.getViewModelStore():获取view层的viewModelStore
        //factory:它将被用来实例化新的viewmodel
        return new ViewModelProvider(fragment.getViewModelStore(), factory);
    }

其中factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);的作用:创建AndroidViewModel和ViewModel,获取一个有效的AndroidViewModelFactory

点击查看new ViewModelProvider(activity.getViewModelStore(), factory)的ViewModelProvider类中。可以看到在get()方法中

 @NonNull
    @MainThread
    public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
        ViewModel viewModel = mViewModelStore.get(key);

        if (modelClass.isInstance(viewModel)) {
            //noinspection unchecked
            return (T) viewModel;
        } else {
            //noinspection StatementWithEmptyBody
            if (viewModel != null) {
                // TODO: log a warning.
            }
        }
        if (mFactory instanceof KeyedFactory) {
            viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass);
        } else {
            viewModel = (mFactory).create(modelClass);
        }
        mViewModelStore.put(key, viewModel);//将viewModel放入ViewModelStore中
        //noinspection unchecked
        return (T) viewModel;
    }

将你的ViewModel存入ViewModelStore中,对应的Key是(DEFAULT_KEY + “:” + canonicalName)

  • DEFAULT_KEY = “androidx.lifecycle.ViewModelProvider.DefaultKey”
  • canonicalName = modelClass.getCanonicalName();//MyViewModel的文件所在位置如:com.android.test.viewmodel.MyViewModel

3.ViewModelStore:必须通过配置更改来保留{ViewModelStore}的一个实例:如果这个{ViewModelStore}的所有者由于配置更改而被销毁并重新创建,那么所有者的新实例应该仍然拥有相同的{ViewModelStore}的旧实例。
viewModelStore是通过HashMap对ViewModel进行存取操作。
put(String key, ViewModel viewModel)//存储VIewModel
get(String key)//获取已存在的ViewModel
clear() //清除内部存储并通知viewmodel它们不再被使用。

总结

viewModel的基本情况就是这样,它配合LiveData可以对ViewModel中的LiveData数据变化进行观察并随之变化。

发布了19 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xyzahaha/article/details/103450881