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();
}
}