在真正接触并使用MVVM架构的时候,整我的都很差了。由于我的以为,MVVM相对于MVC、MVP学习难度比较大,设计的知识点不是一点半点。因此想慢慢记录下本身的成长。若有错误但愿指正。java
从零开始搭建MVVM架构系列文章(持续更新):
Android从零开始搭建MVVM架构(1)————DataBinding
Android从零开始搭建MVVM架构(2)————ViewModel
Android从零开始搭建MVVM架构(3)————LiveData
Android从零开始搭建MVVM架构(4)————Room(从入门到进阶)
Android从零开始搭建MVVM架构(5)————Lifecycles
Android从零开始搭建MVVM架构(6)————使用玩Android API带你搭建MVVM框架(初级篇)
Android从零开始搭建MVVM架构(7) ———— 使用玩Android API带你搭建MVVM框架(终极篇)android
仍是那张图AAC(Android Architecture Components)git
这篇咱们讲ViewModel。这里咱们只是简单了解和认识MVVM中的ViewModel。等把这些组件都认识后,咱们再以wanAndroid api撸一遍正题的MVVM项目。github
还记得MVP中的Model吗。这里的ViewModel有点相似MVP中的Model的做用。可是google出了一套AAC组件。这些组件让开发者能开发高效的项目。其中ViewModel也是其中组件之一。api
简介:ViewModel是以生命周期的方式存储与管理UI相关数据
做用:
一、在MVVM模式中,使Model与View分离
二、负责为ui准备数据
三、存储数据网络
这里最大的亮点是以生命周期的方式。举例:假如在Activity里使用。他会贯穿整个Activity里的生命周期。先看张图:架构
首先把结果先总结如下几点(后面用例子验证):app
为何整个生命周期方式很重要?例如:app须要频繁异步请求数据,好比请求网络调接口,这些都是至关耗时。好比Activity被销毁后接口请求才返回,考虑到内存泄漏状况,会给咱们增添好多复杂工做。但如今咱们利用ViewModel处理数据回调,能够解决此问题。意思只要继承咱们的ViewModel后,可能会出现的bug,google都帮咱们处理了。框架
怎么看上面的生命周期图呢
一、Activity created(走了3个生命周期),对应于ViewModel的scope。
二、Activity rorared(相似切换了横竖屏幕),仍是对应scope
三、finish()(Activity销毁),依赖是scope
四、Finished (已经销毁了)。调用ViewModel的onCleared。异步
这样说很模糊,看一下例子
咱们首先建立咱们的MyViewModel,继承ViewModel。并重写onCleared()
public class MyViewModel extends ViewModel {
@Override
protected void onCleared() {
super.onCleared();
LogUtils.i("MyViewModel的相关","Activity被杀死后也会被销毁!");
}
}
复制代码
点开ViewModel的源码:
implementation 'android.arch.lifecycle:extensions:1.1.1'
public class ViewModelActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewmodel);
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onCreate ==> " + myViewModel.hashCode());
}
@Override
protected void onStart() {
super.onStart();
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onStart ==> " + myViewModel.hashCode());
}
@Override
protected void onResume() {
super.onResume();
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onResume ==> " + myViewModel.hashCode());
}
@Override
protected void onPause() {
super.onPause();
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onPause ==> " + myViewModel.hashCode());
}
@Override
protected void onStop() {
super.onStop();
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onStop ==> " + myViewModel.hashCode());
}
@Override
protected void onDestroy() {
super.onDestroy();
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
LogUtils.i("MyViewModel的相关", "onDestroy ==> " + myViewModel.hashCode());
}
}
复制代码
运行项目后,看打印;这里能够看到,hashCode值都是同样的。:
接着咱们让手机横竖切换下,看打印。一样能够看到hashCode值是同样的,没有改变:
最后,咱们退出这个页面,看打印。这里在调用了ViewModel的onCleared后销毁后,hashCode值才从新建立。这里惟一疑点是,这里和官网图有些不一样,ViewModel的销毁onClered,在Ondestroy的前一步(只是和图解效果有差别,可是流程是对的,若有小伙伴对这块熟悉,请指点下):
好比咱们Activity里还展现了不少个Fragment。咱们这里只须要看一段Fragment里的代码就清楚了
//从getActivity()这句,那可不是同一个MyViewModel吗。
ViewModelProviders.of(getActivity()).get(MyViewModel.class)
复制代码