Android组件-ViewModel 源码分析

android viewModel源码分析
摘要由CSDN通过智能技术生成

android viewModel源码分析

VeiwModel 简介

	ViewModel是google官方的MVVM架构组件,目前已经集成到了最新的支持库中了,是MVVM架构的核心组件之一,ViewModel是把View和Model关联起来的加工厂。
	ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据。ViewModel中数据会一直存活即使 Activity Configuration发生变化。

viewModel可以解决以下痛点:
1.数据持久化
  在系统销毁和重建Activity时,涉及到数据保存问题,显示重新请求或者加载数据是不友好的.使用 Activity 的onSaveInstanceState()机制保存和恢复数据缺点明显,只适合保存少量可以被序列化,反序列化数据,对于列表型这种庞大的数据类型并不适合,利用VeiwModel的存活机制可以解决此痛点.
2.异步请求回调易引发内存泄露
app通常需要频繁异步请求数据,在activity或者fargment中接收数据回调,就要在销毁时对其进行清理,避免内存泄露,随着项目扩大,维护成本增加.但利用ViewModel处理数据,可以解决.
3.分担UI负担,职责分明
UI Controller 比如 Activity 、Fragment 是设计用来渲染展示数据、响应用户行为、处理系统的某些交互,不应处理数据逻辑,我们可以分离出数据操作的职责给 ViewModel
4.Fragment 间数据共享
比如在一个 Activity 里有多个 Fragment,这 Fragment 之间需要做某些交互。我之前的做法是接口回调,需要统一在 Activity 里管理,并且不可避免的 Fragment 之间还得互相持有对方的引用.
我们可以利用ViewModel的作用域机制共享数据.

public class SharedViewModel extends ViewModel {
   
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
   
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
   
        return selected;
    }
}

public class MasterFragment extends Fragment {
   
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
   
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {
   
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, {
    item ->
           // Update the UI.
        });
    }
}

下面对ViewModel相关源码进行分析

1. ViewModel的创建

ViewModel vm = ViewModelProviders.of(getActivity()).get(getModelClass())

对上面代码拆分:

ViewModelProvider provider = ViewModelProviders.of(getActivity());
ViewModel vm = provider.get(getModelClass());

进入ViewModelProvider.of(getActivity());

 public static ViewModelProvider of(@NonNull FragmentActivity activity) {
   
 		// 传入 activity 和 null Factory
        return of(activity, null);
    }
 public static ViewModelProvider of(@NonNull FragmentActivity activity,
            @Nullable Factory factory) {
   
            // 获取 application
        Application application = checkApplication(activity);
        // factory为null , 创建默认的 AndroidViewModelFactory
        if (factory == null) {
   
            factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        // 创建 ViewModelProvider(ViewModelStore , factory)
        return new ViewModelProvider(ViewModelStores.of(activity), factory);
    }

进入ViewModelProvider 的 get(class);方法

 public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
   
 		// 包含路径的类名
        String canonicalName = modelClass.getCanonicalName();
        if (canonicalName == null) {
   
            throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
        }
        // 根据canonicalName生成 key
        return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
    }
 public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
   
 		// 根据 key 从mViewModelStore中获取 ViewModel
        ViewModel viewModel = mViewModelStore.get(key);
        // viewModle不为空,并且是modelClass类型,则返回viewModel
        if (modelClass.isInstance(viewModel)) {
   
            return (T) viewModel;
        } else {
   
            if (viewModel != null) {
   
            }
        }
        // 根据传入的工厂类创建ViewModel(这里就是viewModel的最终创建)
        viewModel = mFactory.create(modelClass);
        // 将viewModel缓存到VeiwModelStore中
        mViewModelStore.put(key, viewModel);
        return (T) viewModel;
    }

从上面源码中可以看出,ViewModel的创建是由传入的ViewModelFactory创建的
在这里ViewModelFactory 是默认的

 // factory为null , 创建默认的 AndroidViewModelFactory
  if (factory == null) {
   
     factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
  }

 public static class AndroidViewModelFactory extends ViewModelProvider.NewInstanceFactory {
   
        private static AndroidViewModelFactory sInstance;
        // 单例
        public static AndroidViewModelFactory getInstance(@NonNull Application application) {
   
            if (sInstance == null) {
   
                sInstance = new AndroidViewModelFactory(application);
            }
            return sInstance;
        }
        private Application mApplication;
        public AndroidViewModelFactory(@NonNull Application application) {
   
            mApplication = application
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值