Mark的架构学习笔记---Android_MVP
前言:
我是名安卓程序员。当我第一次接触到架构这个概念时,说实话我一头雾水。我现实了解了MVC模式,当我开始接触MVP模式时,我啊真的彻底被搞懵了!怎么把一个activity拆成了四个或五者,如果分装过后会更多,想象下,一下子猛的看那么复杂的对我来说无益处。这边文章呢我实现只是一个加你简单单的Demo练习,参考代码和资料来源于网上(备注于文底部)。
记录只是让自己加深理解。
说明:
- 步骤1:UI实现View方法,引用Presenter
- 步骤2:Presenter调用Model,走Model具体逻辑
- 步骤3:Model逻辑实现,回调Presenter方法
- 步骤4:Presenter回调View,即回到UI,回调View方法
首先我们定义下View层
定义接口 IUserView
1 | public interface IUserView { |
一个是拿到数据,一个是把数据给别人,
我们需要让我们的Activity去实现这个接口里面的方法,
然后去做一些数据的显示或者获取。 Presenter与View交互是通过接口。所以我们这里需要定义一个IUserView,
难点就在于应该有哪些方法,我们看一眼效果图会发现一个是保存,一个是载入,
所以我们就创建两个方法,分别是:getUser和setUser;
然后再MainActivity中与实现这个View层的接口
如图所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class MainActivity extends AppCompatActivity implements IUserView {
private UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new UserPresenter(this);
initEvent();
}
private void initEvent() {
findViewById(R.id.btn_load).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
presenter.loadUser();
}
});
findViewById(R.id.btn_save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
presenter.saveUser();
}
});
}
@Override
public UserBean getUser() {
int id = Integer.valueOf(et_id.getText().toString().trim());
String name = et_name.getText().toString().trim();
if (name != null) {
UserBean bean = new UserBean();
bean.setId(id);
bean.setName(name);
return bean;
}
return null;
}
@Override
public void setUser(UserBean bean) {
if (bean!=null){
tv_data_show.setText(bean.toString());
}
}
}
//省略了部分控件的初始化代码
是不是觉得曾在某个文章中看见过,哈哈哈,自己敲一边你会得到自己的理解。
定义下Model层
- 首先我们的更具接口或者你的业务代码去定义自己的实体类 UserBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class UserBean {
private int id;
private String name;
...getter and setter 方法
@Override
public String toString() {
return "UserBean{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
} - 实体类的接口 IUser
这里大家要注意一下,IUser里面主要是接口,首先,我们要想好,在Presenter中要实现哪些逻辑,要用到哪些方法,然后就在这里定义哪些方法。User主要是IUser的实现,返回一些数据,具体返回那些数据,就有大家自己去根据实际情况而定。
1
2
3
4public interface IUser {
void savaUserInfo(UserBean user);
UserBean loadUserInfo();
} - 实体类的业务实现类 User
这里主要是实现IUser接口里面定义的业务实现方法,你想干啥干就可以在里面自己凿凿
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class User implements IUser {
private UserBean bean;
@Override
public void savaUserInfo(UserBean user) {
this.bean = user;
}
@Override
public UserBean loadUserInfo() {
if (bean != null) {
return bean;
}
return null;
}
}定义最重要的Presenter层
是连接Activity(在这可以理解为就是View层,因为Activity实现了 IUserView 接口)和Model的重要桥梁,所有的业务逻辑都在它里面完成:
源码地址1
2
3
4
5
6
7
8
9
10
11
12
13
14public class UserPresenter {
private IUser user;
private IUserView userView;
public UserPresenter(IUserView userView) {
this.userView = userView;
user = new User();
}
public void saveUser(){
user.savaUserInfo(userView.getUser());
}
public void loadUser(){
userView.setUser(user.loadUserInfo());
}
}
下一篇我会结合自己封装的retrofit写一个网络请求的demo笔记,加油⛽️