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 的需要使用弱引用,来防止内存泄漏的问题。