Android 中MVP模式入门
2018-01-15 本文已影响50人
涛涛123759
1、MVP和MVC
MVC简介
在Android我们经常会用MVC模式,其中。
M对应Model,代表业务数据
V对应View,代表视图
C对应Controller,代表控制器。
用户通过界面组件进行操作,也就是View层,相应的动作会传递给控制器也就是Controller层,而Controller根据自己的业务逻辑去操作数据层也就是Model,而最终数据层的变化会同步更新到视图层。
MVP简介
M(Model) 数据相关层
V(View) 视图层,如Activity上的布局
P(Presenter) 纽带层,用来连接Model与View.
而在架构中运用MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:
View 对应于Activity,负责View的绘制以及与用户交互
Model 依然是业务逻辑和实体模型
Presenter 负责完成View于Model间的交互
MVP 与 MVC 区别
其实最明显的区别就是,MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的(代码中会体现)。
二、代码
目录结构:
运行结果:
(一)Model:
public class User {
private String name;
private String sex;
public User(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public interface IUserBiz {
void getData(String name, String sex, OnSteDataListener listener);
}
UserBiz类主要云用来加载和保存数据,并把数据通过presenter传到view中
public class UserBiz implements IUserBiz{
@Override
public void getData(final String name, final String sex, final OnSteDataListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000); //延时2s
} catch (InterruptedException e) {
e.printStackTrace();
}
if ("1".equals(name) && "2".equals(sex)) {
User user = new User(name, sex); //初始化数据
listener.setSuccess(user); //把正确的数据传到presenter中
} else {
listener.setFailed();//把错误的数据传到presenter中
}
}
}).start();
}
}
public interface OnSteDataListener {
void setSuccess(User user);
void setFailed();
}
(二) View
在Activity中需要用到的interface
public interface IUserLoadView {
void initView();
String getName();
String getSex();
void setTextView(User user);
void setPresenter();
}
setPresenter 方法主要用来初始化Presenter;
public class MainActivity extends AppCompatActivity implements IUserLoadView {
private EditText editName, editSex;
private TextView textView;
private Button btnGet, btnSet;
private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setPresenter();
}
@Override
public void initView() {
editName = (EditText) findViewById(R.id.edit_name);
editSex = (EditText) findViewById(R.id.edit_sex);
textView = (TextView) findViewById(R.id.text_view);
btnGet = (Button) findViewById(R.id.btn_get);
btnSet = (Button) findViewById(R.id.btn_set);
btnGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userPresenter.getDatas();
}
});
}
@Override
public String getName() {
return editName.getText().toString();
}
@Override
public String getSex() {
return editSex.getText().toString();
}
@Override
public void setTextView(final User user) {
textView.post(new Runnable() {//在主线程中加载UI
@Override
public void run() {
if (null != user) {
textView.setText("姓名 : " + user.getName() +
"/n性别 : " + user.getSex());
} else {
textView.setText("获取数据失败!");
}
}
});
}
@Override
public void setPresenter() {
userPresenter = new UserPresenter(this);
}
}
用MainActivity中setTextView()接受Presenter传过来的数据时,一定要在主线程中把数据展示到界面中。
(三)Presenter
Presenter是用作Model和View之间交互的桥梁
public interface IPresenterInterface {
void getDatas();
}
public class UserPresenter implements IPresenterInterface{
private IUserLoadView iUserLoadView;
private UserBiz userBiz;
public UserPresenter(IUserLoadView iUserLoadView) {
this.iUserLoadView = iUserLoadView;
userBiz = new UserBiz();
}
@Override
public void getDatas() {
userBiz.getData(iUserLoadView.getName(), iUserLoadView.getSex(), new OnSteDataListener() {
@Override
public void setSuccess(User user) {
iUserLoadView.setTextView(user); //正确数据展示到View中
}
@Override
public void setFailed() {
iUserLoadView.setTextView(null); //错误数据展示到View中
}
});
}
}