Android从零开始搭建MVVM架构(2)————ViewModel

在真正接触并使用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


1、ViewModel

还记得MVP中的Model吗。这里的ViewModel有点相似MVP中的Model的做用。可是google出了一套AAC组件。这些组件让开发者能开发高效的项目。其中ViewModel也是其中组件之一。api

1.一、为何会有这个ViewModel组件

简介:ViewModel是以生命周期的方式存储与管理UI相关数据
做用
一、在MVVM模式中,使Model与View分离
二、负责为ui准备数据
三、存储数据网络

这里最大的亮点是以生命周期的方式。举例:假如在Activity里使用。他会贯穿整个Activity里的生命周期。先看张图:架构

首先把结果先总结如下几点(后面用例子验证):app

  • ViewModel只会在Activity存活,且只会建立一次。当销毁时,会主动调用onClered。

为何整个生命周期方式很重要?例如:app须要频繁异步请求数据,好比请求网络调接口,这些都是至关耗时。好比Activity被销毁后接口请求才返回,考虑到内存泄漏状况,会给咱们增添好多复杂工做。但如今咱们利用ViewModel处理数据回调,能够解决此问题。意思只要继承咱们的ViewModel后,可能会出现的bug,google都帮咱们处理了。框架

  • 由于在Activity存活时,只建立一次,那么在此Activity下的全部Fragment均可以共享一个ViewModel
  • 因为 ViewModel 生命周期可能长与 activity 生命周期,因此为了不内存泄漏Google禁止在ViewModel中持有Context或activity或view的引用。若是非得使用Context, 能够继承AndroidViewModel 类中获取ApplicationContext
  • 以前咱们在activity销毁重建时,能够用activity的onSaveInstanceState()机制保存和恢复数据,但缺点明显, 只适合保存少许的能够被序列化、反序列化的数据。假如咱们须要保存一个比较大的数据,这个时候ViewModel就能够实现。


怎么看上面的生命周期图呢
一、Activity created(走了3个生命周期),对应于ViewModel的scope。
二、Activity rorared(相似切换了横竖屏幕),仍是对应scope
三、finish()(Activity销毁),依赖是scope
四、Finished (已经销毁了)。调用ViewModel的onCleared。异步

这样说很模糊,看一下例子


2、探索ViewModel的生命周期

咱们首先建立咱们的MyViewModel,继承ViewModel。并重写onCleared()

public class MyViewModel extends ViewModel {
    @Override
    protected void onCleared() {
        super.onCleared();
        LogUtils.i("MyViewModel的相关","Activity被杀死后也会被销毁!");
    }
}
复制代码

点开ViewModel的源码:

由于这层没有透露出具体的生命周期绑定和销毁的具体实现。咱们还要去找实现类。这里咱们本着简单使用的原则,那么我就直接在Activity里打印MyViewModel的hashCode值来验证上面的图,Activity里的代码。这里还要说下,这里咱们用到了ViewModelProciders类,因此要引入下依赖

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的前一步(只是和图解效果有差别,可是流程是对的,若有小伙伴对这块熟悉,请指点下):


3、与Fragment间共享数据

好比咱们Activity里还展现了不少个Fragment。咱们这里只须要看一段Fragment里的代码就清楚了

//从getActivity()这句,那可不是同一个MyViewModel吗。
ViewModelProviders.of(getActivity()).get(MyViewModel.class)
复制代码

至此这里对简单的ViewModel作了简单介绍,和使用。让咱们一块儿慢慢实现本身的MVVM框架把!!

本文demo地址

相关文章
相关标签/搜索