前言
通过一个小案例,帮助大家了解MVVM。最终实现一个MVVM通用框架。代码:github。(如有错误之处,请在评论区指出,谢谢。如果感觉写的不错,请点赞,关注,谢谢。)
上一个小节,只是理论介绍了MVVM,DataBinding,ViewModel,LiveData,这一小节,讲解一下他们的使用方式。如果已经对这些基础知识很了解,可以直接看下一节。
目录:
Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想2(入门实战MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想3(封装基类BaseMvvmActivity,BaseMvvmFragment)
什么是MVVM?
盗的一张图
View:对应于Activity/Fragment/自定义View,主要负责UI渲染。
Model:实体模型
ViewModel: 负责业务逻辑处理,负责View和Model的交互。和View层双向绑定。
Mvvm模式是通过将View层和ViewModel层进行双向绑定, View层的变化会自动通知给ViewModel层,而ViewModel层的数据变化也会通知给View层进行相应的UI的更新。这样,Model层只负责暴露获取数据的方法,View层只负责监听数据的变化更新,而ViewModel负责接收View层的事件指令以及获取并处理数据。从而实现业务逻辑和Ui的隔离。
对比MVP
了解MVP编程思想的同学都知道MVP一个最大的缺点就是需要写大量接口。没接触过MVP的童鞋可以看一下我之前写的 Android-MVP编程思想系列。
MVP是对MVC的C的演化,MVVM是对MVP的P的演化。MVVM的出现是MVP的进化版本,弥补了MVP需要大量接口的缺点。如何弥补的?使用了双向绑定这个思想。原来MVP,M和V直接的通信通过P层和接口来实现。现在使用双向绑定,VM,所以就不需要接口了。MVVM是一种思想,采用双向绑定将Model和View绑定起来, View的变动自动反映在View Model,反之亦然。这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了,双向绑定的机制使得M和V之间的通信工作不需要再使用接口了。
涉及的库
(1) DataBinding
Data Binding顾名思义,数据绑定,是Google对MVVM在Android上的一种实现,可以直接绑定数据到xml中,并实现自动刷新。现在最新的版本还支持双向绑定。
作用:数据与view自动映射,所以不需要写findViewByid, onClickListernr.(这一点类似使用的ButterKnife)
不需要setText()手动设置数据。比手动性能更高。
(1) ViewModel
MVVM中的VM,非常重要,负责加载数据,逻辑编写。
Android 官方提供了ViewModel基类是以可感知生命周期的方式存储和管理 UI 相关数据。我只想说,太他踏马好用了。。。。
优势(1)举个栗子:在屏幕旋转的时候会经历 Activity 的销毁与重新创建,这里就涉及到数据保存的问题,显然重新请求或加载数据是不友好的。在 ViewModel 出现之前我们可以用 Activity 的 onSaveInstanceState() 机制保存和恢复数据,但缺点很明显,onSaveInstanceState只适合保存少量的可以被序列化、反序列化的数据,这种机制明显不合适。所以上ViewModel…屌炸天,有没有,让开发者只专注业务逻辑。
优势(2)Fragments 间共享数据,看代码(来自andorid官网)
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// Update the UI.
});
}
}
LiveData
是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
解释一下:这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。当Activity停止时不会引起崩溃,这是因为组件处于非激活状态时,不会收到,不需要额外的手动处理来响应生命周期的变化。屌炸天的东西,用起来。。。。
总结一句:mvvm对mvp的横向演进,用双向绑定机制解放了我们拿到数据关注某个具体控件,并隐式的绑定了View层的生命周期,在内存泄漏上有一定优势。
这一小节简单介绍了MVVM模式,以及Android中支持MVVM的官方库。下一节开始使用这些库来封装好用的MVVM架构。
参考:
https://blog.csdn.net/user11223344abc/article/details/82661128
https://blog.csdn.net/yyz_1987/article/details/81380664