MVP到底是什么?
mvp其实只是一个让代码变得优雅的结构。
M:数据层,处理网络请求回来的数据,数据计算等。
V:view层,只负责view的变化
P:负责M和V的交互,通过构造函数传入IV,构造函数内new M,P中处理view与数据的业务交互。
上代码吧,实现一个登陆的简单例子。
先看整个目录结构:
public interface LoginListener {
void onSuccess();
void onFailed();
}
public interface IModel {
void login(String name,String password,LoginListener listener);
}
public class LoginModel implements IModel {
@Override
public void login(String name, String password, LoginListener listener) {
// 发起网络请求,处理返回数据
if ("carl".equals(name) && "123456".equals(password)) {
listener.onSuccess();
} else {
listener.onFailed();
}
}
}
public class LoginPresenter {
private final ILoginView mLoginView;
private final LoginModel mLoginModel;
public LoginPresenter(ILoginView loginView) {
this.mLoginModel = new LoginModel();
this.mLoginView = loginView;
}
public void login(){
mLoginModel.login(mLoginView.getName(), mLoginView.getPassword(), new LoginListener() {
@Override
public void onSuccess() {
mLoginView.loginSuccess();
}
@Override
public void onFailed() {
mLoginView.loginFailed();
}
});
}
}
public interface ILoginView {
String getName();
String getPassword();
void loginSuccess();
void loginFailed();
}
public class LoginActivity extends Activity implements ILoginView {
private LoginPresenter mPresenter;
private EditText mEditTextName;
private EditText mEditTextPs;
private TextView mTvLogin;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_login);
intView();
setData();
}
private void intView() {
mEditTextName = findViewById(R.id.mEditTextName);
mEditTextPs = findViewById(R.id.mEditTextPs);
mTvLogin = findViewById(R.id.mTvLogin);
mTvLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.login();
}
});
}
private void setData() {
mPresenter = new LoginPresenter(this);
}
@Override
public String getName() {
return mEditTextName.getText().toString();
}
@Override
public String getPassword() {
return mEditTextPs.getText().toString();
}
@Override
public void loginSuccess() {
Toast.makeText(this, "success", Toast.LENGTH_LONG).show();
}
@Override
public void loginFailed() {
Toast.makeText(this, "failed", Toast.LENGTH_LONG).show();
}
}