对于Mvp架构的一点理解,如下图所示:
项目包结构示例:
关键类:
ILoginModel 接口类
public interface ILoginModel {
void doLogin(HashMap<String, String> params, IBaseListener<ResLogin> iBaseListener);
}
LoginModel实现类
public class LoginModel implements ILoginModel {
@Override
public void doLogin(HashMap<String, String> params, final IBaseListener<ResLogin> iBaseListener) {
//对应的网络请求
VolleyRequestUtil.RequestPost(Constant.req_base + Constant.req_login, "login", params, new VolleyListenerInterface(VolleyListenerInterface.mListener, VolleyListenerInterface.mErrorListener) {
@Override
public void onMySuccess(String result) {
ResLogin resLogin = GsonUtil.getGsonUtil().getBean(result, ResLogin.class);
iBaseListener.onSuccess(resLogin);
}
@Override
public void onMyError(VolleyError error) {
iBaseListener.onFailed(error.getMessage());
}
});
}
}
LoginActivity UI界面
public class LoginActivity extends AppCompatActivity implements ILoginView {
private AutoCompleteTextView mEmailView;
private EditText mPasswordView;
private View mProgressView;
private View mLoginFormView;
private Button mEmailSignInButton;
private LoginPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPresenter = new LoginPresenter(this);
findViews();
initViews();
}
private void findViews() {
mEmailView = findViewById(R.id.email);
mPasswordView = findViewById(R.id.password);
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
mEmailSignInButton = findViewById(R.id.email_sign_in_button);
}
private void initViews() {
mEmailSignInButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.login();
}
});
}
@Override
public void setLoginSuccess(ResLogin resLogin) {
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("userId", resLogin.getRetObj().getUserId());
startActivity(intent);
}
@Override
public void setLoginFailed(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void showProgress() {
mLoginFormView.setVisibility(View.GONE);
mProgressView.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
mLoginFormView.setVisibility(View.VISIBLE);
mProgressView.setVisibility(View.GONE);
}
@Override
public String getUserName() {
return mEmailView.getText().toString().trim();
}
@Override
public String getPassword() {
return mPasswordView.getText().toString().trim();
}
@Override
public void showCheckResult(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
ILoginView P与V交互类
public interface ILoginView {
void setLoginSuccess(ResLogin resLogin);
void setLoginFailed(String msg);
void showProgress();
void hideProgress();
String getUserName();
String getPassword();
void showCheckResult(String msg);
}
LoginPresenter协调者
public class LoginPresenter {
private ILoginModel iLoginModel;
private ILoginView iLoginView;
public LoginPresenter(ILoginView iLoginView) {
this.iLoginView = iLoginView;
iLoginModel = new LoginModel();
}
public String checkUserName(String userName) {
if (TextUtils.isEmpty(userName)) {
return "请输入用户名";
}
return null;
}
public String checkPassword(String password) {
if (TextUtils.isEmpty(password)) {
return "请输入密码";
}
if (password.length() < 6 || password.length() > 16) {
return "密码格式错误,长度应为6~16位";
}
return null;
}
public HashMap<String, String> getParams() {
HashMap<String, String> map = new HashMap<>();
String name = iLoginView.getUserName();
String psd = iLoginView.getPassword();
String jsonParams = "{\"account\":\"" + name + "\",\"password\":\"" + psd + "\",\"appType\":\"test\"}";
map.put("jsonParams", jsonParams);
return map;
}
public void login() {
String uName = iLoginView.getUserName();
String uPsd = iLoginView.getPassword();
String error;
if ((error = checkUserName(uName)) != null) {
iLoginView.showCheckResult(error);
return;
}
if ((error = checkPassword(uPsd)) != null) {
iLoginView.showCheckResult(error);
return;
}
iLoginView.showProgress();
iLoginModel.doLogin(getParams(), new IBaseListener<ResLogin>() {
@Override
public void onSuccess(ResLogin resLogin) {
iLoginView.hideProgress();
if (resLogin != null && resLogin.getRetCode() == 0) {
iLoginView.setLoginSuccess(resLogin);
} else {
iLoginView.setLoginFailed("no object");
}
}
@Override
public void onFailed(String msg) {
iLoginView.hideProgress();
iLoginView.setLoginFailed(msg);
}
});
}
}