1 MVP简介
Presenter传递数据给Model,Model得到数据来请求网络,再返回数据给Presenter,Presenter再把得到的Model数据传递给View显示。MVP整体的一个流程就是这样。相比MVC来说,Model和View互相不干涉,达到完全解耦。MVP原理图如下所示:
MVP
2 源码示例
- 定义一个ILogin接口
public interface ILogin {
interface ILoginView{
void setUserName(String userName);
void setPassword(String password);
String getUserName();
String getPassword();
}
interface ILoginPresenter{
void login();
}
interface ILoginModel{
void login(String userName,String password,ICallBack<String> callBack);
}
}
- 定义一个结果返回接口ICallBack
package com.example.mvpdemo;
public interface ICallBack<T> {
void result(T resultInfo);
}
- 然后分别实现Model、Presenter及View逻辑,首先写一个LoginModel类,该类继承ILoginModel,主要是进行网络请求、数据库操作等数据方面的操作
package com.example.mvpdemo;
public class LoginModel implements ILogin.ILoginModel {
@Override
public void login(String userName, String password, ICallBack<String> callBack) {
//这里进行网络请求返回数据等
callBack.result("登录成功");
}
}
- 然后写一个LoginPresenter类,该类继承ILoginPresenter,主要作用是处理业务逻辑方面的操作,然后将最终数据返回给View显示,实现Model与View的解耦
package com.example.mvpdemo;
import android.content.Context;
import android.widget.Toast;
public class LoginPresenter implements ILogin.ILoginPresenter {
private ILogin.ILoginView mLoginView;
private ILogin.ILoginModel mLoginModel;
private Context mContext;
public LoginPresenter(ILogin.ILoginView loginView, Context context){
mLoginView = loginView;
mLoginModel = new LoginModel();
mContext = context;
}
private String getUserName(){
return mLoginView.getUserName();
}
private String getPassword(){
return mLoginView.getPassword();
}
@Override
public void login() {
String userName = getUserName();
String password = getPassword();
//判断输入是否为空
if (!inputValid()){
return;
}
mLoginModel.login(userName,password,new ICallBack<String>(){
@Override
public void result(String resultInfo) {
if (resultInfo.equals("登录成功")){
Toast.makeText(mContext,"登录成功!",Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean inputValid(){
if(getPassword().isEmpty()){
Toast.makeText(mContext,"密码不能为空",Toast.LENGTH_SHORT).show();
return false;
}
if (getUserName().isEmpty()){
Toast.makeText(mContext,"用户名不能为空",Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
}
- 最后写View,这里的View指的是Activity或者Fragment。让MainActivity实现ILoginView接口,然后调用LoginPresenter方法,将输入数据传入到Presenter层进行业务逻辑操作。
package com.example.mvpdemo;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity implements ILogin.ILoginView {
private EditText userName;
private EditText password;
private Button button;
private ILogin.ILoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
initEvent();
}
private void initEvent() {
button.setOnClickListener(listener);
}
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
mLoginPresenter.login();
break;
}
}
};
private void initData() {
mLoginPresenter = new LoginPresenter(this,this);
}
private void initView() {
userName = findViewById(R.id.user_name);
password = findViewById(R.id.password);
button = findViewById(R.id.button);
}
@Override
public void setUserName(String userName) {
this.userName.setText(userName);
}
@Override
public void setPassword(String password) {
this.password.setText(password);
}
@Override
public String getUserName() {
return userName.getText()==null?"":userName.getText().toString();
}
@Override
public String getPassword() {
return password.getText()==null?"":password.getText().toString();
}
}
网友评论