先需要给项目建立3个包,分别是model、view、presenter。
1.其中model主要用来处理业务逻辑,这里指数据读写,先写接口后写实现。
2.view主要更新ui中的view状态。
3.presenter是model和view之间的联系者,主导器,通过iView和iModel接口操作model和view,activity可以把所有逻辑给presenter处理, 这样java逻辑就从手机的activity中分离出来。
今天照着网上的另一篇文章,做了一个简单的demo,使用了一下MVP模式,确实会使得项目结构更加清晰,但是里面也有些模糊不清的地方。链接:mvp模式简单demo
UI界面:
是由两个EditText控件和两个Button和一个ProgressBar组成,其中ProgressBar我隐藏了。
项目结构:
每个包下面都有接口和对应的实现类。
需求分析和代码解释:
这是一个简单的登录页面,需要用户名(userName)和密码(passWord)。所以我们需要在model包下创建一个用户业务逻辑接口和实现类,也就是接口IUser和其实现类UserModel:
public interface IUser {
int checkUserValidity(String userName, String password);
}
public class UserModel implements IUser {
@Override
public int checkUserValidity(String userName, String password) {
if (userName.equals("mvp") && password.equals("mvp")) {
return 1;
}
return 0;
}
}
接下来是view包下的IloginView接口和MainActivity:
public interface ILoginView {
void onClearText();
void onLoginResult(Boolean result, int code);
void onSetProgressBarVisibility(int visibility);
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener,ILoginView {
private EditText et_userName;
private EditText et_password;
private Button btn_login;
private Button btn_clear;
ProgressBar pb_login;
ILoginPresenter iLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iLoginPresenter = new LoginPresenterCompl(this);
initViews();
}
private void initViews() {
et_userName = (EditText) findViewById(R.id.et_userName);
et_password = (EditText) findViewById(R.id.et_password);
pb_login = (ProgressBar) findViewById(R.id.pb_login);
btn_login = (Button) findViewById(R.id.btn_login);
btn_clear = (Button) findViewById(R.id.btn_clear);
btn_login.setOnClickListener(this);
btn_clear.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_login:
iLoginPresenter.setProgressBarVisibility(View.VISIBLE);
btn_login.setEnabled(false);
btn_clear.setEnabled(false);
iLoginPresenter.doLogin(et_userName.getText().toString(),
et_password.getText().toString());
break;
case R.id.btn_clear:
iLoginPresenter.clear();
break;
}
}
@Override
public void onClearText() {
et_userName.setText("");
et_password.setText("");
}
@Override
public void onLoginResult(Boolean result, int code) {
iLoginPresenter.setProgressBarVisibility(View.INVISIBLE);
btn_login.setEnabled(true);
btn_clear.setEnabled(true);
if (result) {
Toast.makeText(this, "Login Success!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Login Fail! code: " + code, Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onSetProgressBarVisibility(int visibility) {
pb_login.setVisibility(visibility);
}
}
可见MainActivity实现了ILoginView接口,现在便可通过传递这个activity和presenter通信。现在最重要的presenter包了,接口ILoginPresenter 和实现类LoginPresenterCompl。
public interface ILoginPresenter {
/*清除用户信息*/
void clear();
/*登录操作*/
void doLogin(String userName, String password);
/*设置进度是否显示*/
void setProgressBarVisibility(int visibility);
}
public class LoginPresenterCompl implements ILoginPresenter {
ILoginView iLoginView;
IUser iUser;
Handler handler;
public LoginPresenterCompl(ILoginView view) {
this.iLoginView = view;
initUser();
handler = new Handler(Looper.getMainLooper());
}
private void initUser() {
iUser = new UserModel();
}
@Override
public void clear() {
iLoginView.onClearText();
}
@Override
public void doLogin(String userName, String password) {
Boolean isLoginSuccess = true;
final int code = iUser.checkUserValidity(userName, password);
if (code != 1) {
isLoginSuccess = false;
}
final Boolean finalIsLoginSuccess = isLoginSuccess;
/*模拟登陆加载*/
handler.postDelayed(new Runnable() {
@Override
public void run() {
iLoginView.onLoginResult(finalIsLoginSuccess, code);
}
}, 3000);
}
@Override
public void setProgressBarVisibility(int visibility) {
iLoginView.onSetProgressBarVisibility(visibility);
}
}
一个简单的mvp模式demo,就完成了。这个模式确实比mvc更好,在项目庞大的情况下,依旧能够保持着清爽的风格,使程序员们维护起来更加的方便。但我并不喜欢这种activity和presenter互传,总觉得有些凌乱,容易思绪混乱,可能习惯了就好吧。希望之后可以改进吧。