MVVM浅析
参考文章
前不久google官方发布了MVVM的正式库。官方的正式MVVM库主要包括下面四个:
其中只有ViewModel是MVVM结构中的一个组件,其他的三个都是辅助性质的。
lifecycles 就是处理UI界面的生命周期,在26版本以后的Support库中,AppCompatActivity和SupportActivity中都实现了LifecycleOwner,内部已经对UI界面的生命周期做了处理了。
LiveData是一个抽象类,我们可以存放UI页面需要的数据,就是把数据包装在LiveData中了,我们可以观测LiveData中的数据变化,但是LiveData是跟UI的生命周期关联的,当UI页面销毁了,LiveData的数据变化回调是不会执行的。
Room 就是一个sqlite数据持久化库,我们也可以使用别的ORM库。
MVVM分为三层
-
Model :
Model层就是职责数据的存储、读取网络数据、操作数据库数据以及I/O,一般会有一个ViewModel对象来调用获取这一部分的数据。
负责数据实现和逻辑处理,当然不止于此,model层将结果通过接口的形式传递给viewModel层 -
View : 对应于Activity和XML,负责View的绘制以及与用户交互,主要负责界面的显示。
-
ViewModel : ViewModel 只做和业务逻辑和业务数据相关的事,
创建关联,将model和view绑定起来,如此之后,我们model的更改,通过viewmodel反馈给view,从而自动刷新界面,viewModel 和MVP中的presenter 的作用类似 ,只不过是通过 databinding 将数据与ui进行了绑定。
DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个关键的工具,它是支持双向绑定的。
看上图
Model
和View
是不会发生关系的,ViewModel
是把View和Model关联起来的MVVM优势总结:
- View和Model双向绑定,一方的改变都会影响另一方,开发者不用再去手动修改UI的数据,互相自动的。
- 不需要findViewById也不需要butterknife,不需要拿到具体的View去设置数据绑定监听器等等,这些都可以用DataBinding完成。
- View和Model的双向绑定是支持生命周期检测的,不会担心页面销毁了还有回调发生,这个由lifeCycle完成。
- 不会像MVC一样导致Activity中代码量巨大,也不会像MVP一样出现大量的View和Presenter接口,项目结构更加低耦合。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
UserBean userBean = new UserBean ("张三", "25");
binding.setUser(userBean );
}
}
这里用DataBindingUtil.setContentView代替了setContentView,然后创建一个 UserBean 对象,通过 binding.setUser(userBean) 与 variable 进行绑定。
注意:这个ActivityMainBinding 是如何生成的呢?他是继承ViewDataBinding,这个类的生成是有规则的,它是根据对应的布局文件的名字生成的,比如:activity_main-->ActivityMainBinding 、fragment-->FragmentBinding即:第一个单词首字母大写,第二个单词首字母大写,最后都会拼上Binding就是生成的Binding类。