Android 中MVVM 的理解

466 阅读2分钟

        MVVM 也是在MVC的基础上的变形,google 推荐使用的方法,jetPack库的持续优化,使MVVM的使用更加方便,以最少的代码来实现高质量,减少了接口的使用,开发更加便捷和高效。除了Model 层和View 和另外其他两种模式之外,使用了ViewModel 作为中间层,和MVP层中的Presenter 类似,都是为了解耦View和Model层, 不同的是减少了接口的回调和使用,直接通过 ViewModel 在xml 里面更新界面 作为JavaBean的角色,调用对应的model 来处理业务逻辑。 

       1 基本使用,使用AndroidStudio   gradle 编译的方式开发。

          第一、在builder.gradle 里面 设置 android {   dataBinding { enable(true)}} ,作用是在编译的时候,会自动生成对应的ViewDataBing代码

         第二、定义ViewModel 可以先定义基本的界面更新需要的数据,作为JavaBean 使用,JavaBean 涉及到更新界面的变量 。

         第三、需要使用databing 的xml 布局 最外层 需要 包 <variable name = "customViewModel",type="自定义ViewModel的全类名"/> 布局     ,可以使用customViewModel.a 成员变量来对xml中的View赋值。  然后编译下, 编译器会自动生对应的 Bing类。 例如xml 名字 : activity_main.xml  则会生成ActivityMainBinding. 

        第四  ActivityMainBinding 实力的初始化,需要借助DataBingUtils.setContentView(),需要传入参数activity,xml 的ID,生成对应的实例。activityMainBinding.setcustomViewModel(), 把有数据的ViewModel对象传递过去,实现更新界面, set + name(首字母大写) 的处理方式。这样把ViewModel 和xml 进行了绑定。

         第五   activityMainBinding.textView  这样直接可以获取 xml 里面View的引用,从而可以操作对应的控件,省略了大量的findViewByID 的使用,并且防止 id错乱导致的控件空指针的问题。

       第六   CustomeViewMode 继承ViewModel  可以监听activity/fragment 销毁,会调用viewmodel 的onClear ,在onClear 方法,可以结束 网络请求。

      第七   LiveData 通过observe(Observer) onChange 方法回调中接收数据 强转回调的数据。 通过postValue 来发送数据。从而减少接口的回调 。 View 和 ViewModel 的交互 用liveData 代替接口回调。  ViewModel  和 Model的交互 还是要依赖接口回调的方法

    2   源码分析 :

        第一 、 ActivityMainBinding 看不到具体的java 源码,点击会直接跳转到关联的xml里面。setViewModel 的方法同样看不到

       第二、 ActivityMainBindingImpl   属于databing 包的并且继承 ActivityMainBinding , 获取素有View 的引用,然后 使用观察这模式 来观察数据的变化,从而更新界面。

    3  注意事项:

       第一、 当使用Model 来获取数据 来 通知给ViewModel 的需要使用弱引用,来防止内存泄漏的问题。