本次主要看一个mvp的简单demo,不熟悉mvc,mvp的请自行百度
目录结构如下
个人理解MVP模式是隔离了各层之间的交互
bean<->model<->presenter<->view
使得每一层的逻辑独立,功能明确,方便后期维护,接下来就看代码了
1.bean
public class UserBean {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserBean() {
}
}
2.model
2.1 ILoginModel(接口)
public interface ILoginModel {
void login(String username, String password, OnLoginListener loginListener);
}
2.2 LoginModelImpl(实现类,业务类,此处模拟网络登录)
public class LoginModelImpl implements ILoginModel {
@Override
public void login(final String username, final String password,
final OnLoginListener loginListener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if("123".equals(username) && "456".equals(password)){
loginListener.loginSuccess();
} else {
loginListener.loginFailed();
}
}
}).start();;
}
2.3 OnLoginListener(监听)
public interface OnLoginListener {
void loginSuccess();
void loginFailed();
}
3 控制者 presenter,网络请求返回的结果通过handler交给UI线程处理,当然此处也可以用asynctask eventbus等方式
public class LoginPresenter implements OnLoginListener {
private static LoginActivity mMainActivity;
private ILoginModel mLoginModel;
/*//private OnLoginListener mLoginListener;*/
private static Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:// login success
mMainActivity.loginSuccess();
break;
case 2:// login failed
mMainActivity.loginFailed();
break;
default:
break;
}
};
};
public LoginPresenter(LoginActivity mainActivity) {
mMainActivity = mainActivity;
mLoginModel = new LoginModelImpl();
}
public String getUsername() {
return mMainActivity.getUsername();
}
public String getPassword() {
return mMainActivity.getPassword();
}
public void login(String username, String password) {
mMainActivity.showProgress();
mLoginModel.login(username, password, this);
}
public void clear() {
mMainActivity.clear();
}
@Override
public void loginSuccess() {
Message msg = Message.obtain();
msg.what = 1;
mHandler.sendMessage(msg);
}
@Override
public void loginFailed() {
Message msg = Message.obtain();
msg.what = 2;
mHandler.sendMessage(msg);
}
4 view层
4.1 view接口(ILoginView)
public interface ILoginView {
String getUsername();
String getPassword();
void showProgress();
void hideProgress();
void loginSuccess();
void loginFailed();
void clear();
}
4.2 view实现 (UI显示,fragment或者activity)
public class LoginActivity extends Activity implements ILoginView, OnClickListener{
private EditText mUsername;
private EditText mPassword;
private ProgressBar mPb;
private Button mLogin;
private Button mClear;
private LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLoginPresenter = new LoginPresenter(this);
initView();
}
private void initView() {
mUsername = (EditText) findViewById(R.id.et_username);
mPassword = (EditText) findViewById(R.id.et_password);
mPb = (ProgressBar) findViewById(R.id.pb);
mLogin = (Button) findViewById(R.id.login);
mLogin.setOnClickListener(this);
mClear = (Button) findViewById(R.id.clear);
mClear.setOnClickListener(this);
mPb.setVisibility(View.GONE);
}
@Override
public String getUsername() {
return mUsername.getText().toString();
}
@Override
public String getPassword() {
return mPassword.getText().toString();
}
@Override
public void showProgress() {
mPb.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
mPb.setVisibility(View.GONE);
}
@Override
public void loginSuccess() {
Toast.makeText(this, "success", 0).show();
hideProgress();
}
@Override
public void loginFailed() {
Toast.makeText(this, "filed", 0).show();
hideProgress();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login:
mLoginPresenter.login(mLoginPresenter.getUsername(), mLoginPresenter.getPassword());
break;
case R.id.clear:
mLoginPresenter.clear();
break;
default:
break;
}
}
@Override
public void clear() {
mUsername.setText("");
mPassword.setText("");
}
当业务非常简单的时候并不适合用mvp,可是当业务比较复杂的时候,这个时候就可以看到,各个层分离明显,功能划分明确,比如UI的错误肯定在view层去处理就OK了,不会影响到model。本人对mvp的好处体会也不深,项目中并没有用到,只是自行研究了下demo,如果想理解更深刻还是要用起来。