转载请标明出处!
先看代码demo再回看文章效果最佳!
目录
一 mvc
1.1 概述
1.2 作用流程
从view开始,接收到用户的操作,从而交给Controller(Activity),在其处理完它的逻辑后,得到结果同步到Model,再去刷新UI界面。
1.3 现状
Controller(Activity)既要执行View层的职能,又要执行Model层职能,违反了面向对象设计原则之一:单一职责原则。
1.4致命弱点/缺点:
与model和view最关联的activity,它是否能干净地销毁是评估内存泄露最关键的点。
MVC中,activity作为C,对View和Model中间的交互非常多,导致它很容易出现内存泄露。
1.5 代码Demo
网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVC
二 mvp
2.1 概述
2.2 作用流程
- Activity作为View层,接收用户操作后交给Presenter处理;
- Presenter可能自己处理(Google Sample),也可能交给Model处理(现实中常用);
- 最后Presenter收到通知(网络请求结束/异步结束...),再由Presenter去刷新View;
2.3 优点
- 解耦View和Model:如上第三图,修改业务逻辑 找Presenter层;修改页面找View层;
- 所有的逻辑交互(V和M的交互)放在Presenter层;
- 分层较为严谨;
2.4 代码Demo
网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVP_02
三 mvvm
3.1 概述
mvvm或者mvc/mvp是设计思想,DataBinding是一个工具。
m: Model
v:View
vm:ViewModel
Model中数据的改变会直接影响到View中的展示,反之一样;这个时候ViewModel主要针对业务逻辑,不可缺失;
View层和ViewModel层粘合度较高,因为它通过ViewModel获取Model层数据(这是MVVM的思想,DataBinding不存在这个问题);
3.2 操作步骤
1 在android工程的build.gradle中添加依赖
// 添加DataBinding依赖
dataBinding{
enabled = true
}
2 建立一个简单的model(javabean);
3 在布局文件中,最外层用<layout标签包裹起来,并在开头配置data->variable信息;
4 具体填充显示的内容需要用到data->variable->name标识.成员属性
3.3 注意点
1 在activity中必须先ReBuilder,然后再书写代码绑定;
2 切记:javabean中被观察的属性必须是public修饰符,因为是DataBinding的规范;
3 不要既用mvp有用mvvm,没人这样写,不要去这么写;
4 再次强调mvvm是业务思想,DadaBinding是实现思想的重要工具,我们可以把业务写在vm中;
3.4 缺点
内存消耗非常大!
3.4 代码demo
demo中有几个注意的地方:
1 双向绑定:mvvm中数据和视图的双向绑定。正向:View层接收到用户的输入,改变Model层的javabean属性;逆向:View层接收到用户的输入,改变Model层的javabean属性;如下:
public TextWatcher pwdInputListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// View层接收到用户的输入,改变Model层的javabean属性
userInfo.pwd.set(String.valueOf(s));
}
@Override
public void afterTextChanged(Editable s) {
}
};
public View.OnClickListener loginClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// 模拟网络请求
new Thread(new Runnable() {
@Override
public void run() {
// Model层属性的变更,改变View层的显示
userInfo.name.set("Lucas");
//这边可以写业务逻辑
}
}).start();
}
};
2 在实际项目中,具体的业务逻辑可以写在vm中,如上代码注释中所示。
网址:https://github.com/LucasXu01/AndroidDemo/tree/master/NetEase_MVVM