MVVM的小总结

679 阅读3分钟

前言

最近闲着做App的国际版,顺手把项目改成了MVVM+Jetpack+kotlin。为啥这样改呢?以后按住原生开发的架构模式MVVM + JetPack全家桶 + Kotlin = “Google标准化开发模式”,也就是传说的中标准状态管理框架 大部分开发中的坑,都让官方这个jetpack给解决了。

举例描述,把最为写到前面

  • activity把布局xml整成databinding的布局,在布局中写个data,有数据关联的variable1,值我们就是就叫requestModelA,有逻辑处理的variable2,值就叫ClickProxyB。分别和控件相互关联

  • activity中处理逻辑的内部类和界面中的ClickProxyB绑定,那么点击啥的逻辑处理就在这处理了

  • activity中新建一个requestModelA肤质给xml中requestModelA。然后监听自己有没有变化。有变化就会做一些事情,如果直接绑定了ui控件,控件就会自己变。

  • 比如按钮A点击事件给了CLickProxyB处理,然后通过requestModelA请求,带着requestModelA.name去请求,后端或者数据库塞给了requestModelA.musicname为”海阔天空“。那么requestModelA.musicname绑定的那个textview就变成了10,就不用接口回调,太美妙了.如果还监听了requestModelA.musicname,那么还可以在监听的内容里做些弹窗

  • 假设这个viewmodel的生命周期是整个App,那么当有100个界面都和这个控件绑定, 那么这100个界面就都改了,真的太好用了。

1、Lifeccycle

既然提到状态管理,Lifecycle不得不说。主要作用是生命周期管理,保持一致性

  • 1.1、解决了一致性问题。
    • 人类写错的东西无法避免,比如某地图api。要在onStart onPause中写对应的方法,那么我100个界面就要写100个难免会出错,其实我只要抽离在统一生命周期里做即可。
  • 1.2、解决了业务逻辑代码入侵问题
  • 1.3、降低耦合,不需要依赖到某个具体的Activity

2、LiveData

状态的变化,以前我们是用接口回调来完成的,比如mvp,就有恐怖的接口地狱。或者说EventBus,这种属于状态的分发(场景:网络请求回调,跨页面通信的情况)

  • liveData(被lifecycle劫持住)和生命周期绑定的状态分发,可做到可见才分发
  • setValue触发改变,数据observe()观察触发改变,一个触发,多个改变
  • 解决了男追溯、难排查、不可预期的问题,可追溯性很强
  • 有个粘性数据问题,liveDataBus
    • 如果先触发setValue 后observer就用粘性
    • 如果没有上述要求,最好剔除,剔除的方法是通过反射修改版本号

3、Viewmodel(小弟ObservalField,LiveData(慢慢被Flow所取代))

解决状态管理和页面通信(共享ViewModel)的问题

  • Activity被重建(横竖屏切换)八平村在VM里的数据,保存字段的数据的稳定性
  • SharedViewModel 共享
  • 生命周期哼唱,覆盖了宿主的所有环境
  • 解耦,分担了Acititiy/Fragment责任,(ui model)-》VM

4、DataBinding

试图解决一致性的问题@BindingAdapter,将数据处理的逻辑的方法抽离出来,有个误区要注意,不要下面这样写

<TextView 前面讲的DataBinding黑锅事件
   android:text="{逻辑,逻辑,逻辑逻辑逻辑逻辑逻辑逻辑逻辑逻辑逻辑}
  • 可以完成双向绑定,但是比较耗费性能,不用的时候不要打开
  • code全都是在编译期完成的,APT生成代码 。(layout 2 tag ),DataBinding还是会耗费性能的
  • 如果编译不通过,BindingImplxxx,布局写错误
  • 如果用不到单向绑定,双向绑定,尽量用ViewBinding
  • ViewBinding轻量级的 as 3.6 出来的 DataBinding重量级的 编译很慢,耗费性能的问题

5、Navigation

一般情况下,一个Activity多个Fragment基本上会用Navigation 全部大部分都是Activity,则不建议用

图例

image.png

  • Jetpack组件库的ViewModel(),只是一个组件库而已,和MVVM的VM层没有直接关系。