一、MVP框架设计模式基本认识 ???(一) 基本概念 MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块 1.模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;
2.视图(View):负责界面数据的展示,与用户进行交互;
3.主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来
MVP模式的整个核心过程 ???(二)开发中MVP框架模式的设计 1.一般MVP设计都是新建一个mvp的包名,里面分别在建model、view、presenter包名,mvp包名和页面的包名ui的activity和fragment是分开的 mvp放到activity包名下就显得很难看
2.mvp包下的文件设计 ???(1) model包名下的类 设计数据处理的逻辑,这里一般还设计一个内部接口类,让presenter对象可以设置监听并得到数据。因为好多数据处理都是需要子线程的,不能马上就返回数据
???(2) view包名下的类 设计视图中需要的逻辑,都是接口方法,该类也是接口类。这个接口类也是需要固定的Activity页面来实现,并重写里面的方法,在方法里面写入页面的操作,这些重写方法能否得到回调都是Presenter对象来控制的,一般都是数据或逻辑处理完后再判断相应的方法回调
???(3) presenter包名下的类 设计activity和model的交互,既要有View对象,也要有model对象 Activity中把数据相关的逻辑操作都扔给了Presenter去做,View只负责处理与用户界面操作。而Presenter调用Model处理完数据之后,再通过View接口方法更新View显示的信息
二.下面看下MVP模式在具体项目中的使用 登录页面: 点击登录并验证成功后跳转到用户界面
???(一) 详细设计过程和思路 1.写布局页面,两个EditText和一个按钮
2.设计用户的基数User,设置用户名和密码的get和set方法
3.设计mvp中的View接口类LoginView,接口里面定义方法:获得用户的账号、获得用户的密码、登录、显示网络异常、登录验证错误这五个方法 代码:
public interface LoginView {
String getAccount();
String getPassword();
void loginSuccess(User user);
void showNetworkError();
void showVerifyFailed();
}
4.设计mvp中的model类LoginModel,这个类需要验证用户的账号和密码是否正确。并创建一个内部接口,让数据处理完成后返回时间,因为一般网络数据都是在子线程中完成,不能马上返回数据
public class LoginModel {
public void login(String name, String password, OnLoginResultListener onLoginResultListener) {
if ("liwen".equals(name) && "123456".equals(password)) {
onLoginResultListener.loginSuccess(new User(name, password));
} else {
onLoginResultListener.loginFailure();
}
}
public interface OnLoginResultListener {
void loginSuccess(User user);
void loginFailure();
}
}
5.设计mvp中的Presenter类LoginPresenter,实现View和Model的交换,重点理解
public class LoginPresenter {
private LoginModel mLoginModel;
public LoginPresenter() {
mLoginModel = new LoginModel();
}
private LoginView mLoginView;
public void bind(MyActivity loginView) {
mLoginView = loginView;
}
public void login() {
String account = mLoginView.getAccount();
String password = mLoginView.getPassword();
Log.e("TAG", "account:" + account + ",password" + password);
if (checkParameter(account, password)) {
doSomePrepare();
mLoginModel.login(account, password, new LoginModel.OnLoginResultListener() {
@Override
public void loginSuccess(User user) {
mLoginView.loginSuccess(user);
}
@Override
public void loginFailure() {
mLoginView.showVerifyFailed();
}
});
}
}
private void doSomePrepare() {
}
private boolean checkParameter(String account, String password) {
if (TextUtils.isEmpty(account) | TextUtils.isEmpty(password)) {
mLoginView.showVerifyFailed();
return false;
} else if (!checkNetwork()) {
mLoginView.showNetworkError();
return false;
}
return true;
}
public boolean checkNetwork() {
return true;
}
}
上面有些方法是可以不写的,比如检查网络或做一些准备,但是实际程序中,是要做很多判断的,这里就随便啰嗦几句 6.主活动Activity,重点理解
public class MyActivity extends Activity implements LoginView, View.OnClickListener {
private EditText et_name;
private EditText et_password;
private Button btn_logon;
private LoginPresenter loginPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
private void initView() {
et_name = (EditText) findViewById(R.id.et_name);
et_password = (EditText) findViewById(R.id.et_password);
btn_logon = (Button) findViewById(R.id.btn_login);
btn_logon.setOnClickListener(this);
loginPresenter = new LoginPresenter();
loginPresenter.bind(this);
}
@Override
public void onClick(View v) {
loginPresenter.login();
}
@Override
public String getAccount() {
return et_name.getText().toString();
}
@Override
public String getPassword() {
return et_password.getText().toString();
}
@Override
public void loginSuccess(User user) {
Toast.makeText(this, user.getName() + "登录成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, UserInfoActivity.class);
intent.putExtra("user", user);
startActivity(intent);
}
@Override
public void showNetworkError() {
Toast.makeText(this, "当前网络不可用", Toast.LENGTH_SHORT).show();
}
@Override
public void showVerifyFailed() {
Toast.makeText(this, "输入的用户名或密码有误", Toast.LENGTH_SHORT).show();
}
}
上面可以看到在初始化时就创建loginPresenter对象,而loginPresenter的构造方法中也是创建了loginModel对象,Activity实现了LoginView,就相当于有了LoginView对象,这是只需要用loginPresenter绑定LoginView,这时MVP的model、view、presenter三者都已经实例化,并关联在一起了 上面语句loginPresenter绑定LoginView的是:loginPresenter.bind(this);绑定Avtivity,也是绑定View!loginPresenter中调用LoginView的方法都是在Activity中执行的 程序运行后的显示: 下载源码github地址,点击链接:loginMVP
|