最近试着了解了一下流行的android开发模式,学习一下MVP模式的,mvp模式是更符合android开发的一种基于mvc模式的改进的模式,将actvity或者fragment中的一些逻辑操作封装为接口操作,再通过presenter来进行事件的逻辑处理。
M:即传统的model类,这些操作基本与传统的model方法一样。
V:即view层,主要是actvity和fragment
P:即presenter层,主要是对view层中的业务进行接口封装处理
mvp模式能够使整个项目的接口更清晰,功能模块更明确,代码更清晰:
试着用一个登陆模块来用mvp的模式来写:
model部分主要就是数据的获取与处理.view就是视图的展示,presnter就是业务逻辑操作
model层与传统的一样:
public class UserInfo implements Serializable{
String username;
String passowrd;
public UserInfo(String username, String passowrd) {
this.username = username;
this.passowrd = passowrd;
}
public UserInfo() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassowrd() {
return passowrd;
}
public void setPassowrd(String passowrd) {
this.passowrd = passowrd;
}
}
接下来是数据的获取与请求
public interface IUserManager {
UserInfo loadCurrentUserInfo();
void login(String username,String password,RequestDataCallback callback);
}
public interface RequestDataCallback {
void onSuccess();
void onFailure(String msg);
}
public class UserManager implements IUserManager {
protected static UserManager mInstance;
protected UserInfo mCurrentUserInfo;
public static UserManager getmInstance() {
if (mInstance == null) {
synchronized (UserManager.class) {
if (mInstance == null)
mInstance = new UserManager();
}
}
return mInstance;
}
@Override
public UserInfo loadCurrentUserInfo() {
return mCurrentUserInfo;
}
@Override
public void login(final String username, final String password, final RequestDataCallback callback) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (username.equals("123") && password.equals("123")) {
if (callback != null) {
mCurrentUserInfo = new UserInfo(username, password);
callback.onSuccess();
}
} else {
if (callback != null) {
callback.onFailure("信息出错!");
}
}
}
}).start();
}
}
接下来写view层.,将所有涉及到的ui操作都封装成接口
public interface ILoginView {
void initViews();
String getUsername();
String getPassword();
void showProgress();
void hideProgress();
void toMainActivity(UserInfo info);
void loginFailure(String msg);
void clearUsername();
void clearPassword();
}
然后在activity中实现接口
public class LoginActivity extends Activity implements ILoginView ,View.OnClickListener{
protected EditText mUserNameEt, mPasswordt;
protected Button mLoginBtn, mClearBtn;
protected ProgressBar mProgressbar;
protected LoginPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
}
@Override
public void initViews() {
mUserNameEt = (EditText) findViewById(R.id.et_login_username);
mPasswordt = (EditText) findViewById(R.id.et_login_password);
mLoginBtn = (Button) findViewById(R.id.btn_login);
mClearBtn = (Button) findViewById(R.id.btn_clear);
mProgressbar = (ProgressBar) findViewById(R.id.pb_login);
mLoginBtn.setOnClickListener(this);
mClearBtn.setOnClickListener(this);
mPresenter=new LoginPresenter(this);
}
@Override
public String getUsername() {
return mUserNameEt.getText().toString();
}
@Override
public String getPassword() {
return mPasswordt.getText().toString();
}
@Override
public void showProgress() {
mProgressbar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
mProgressbar.setVisibility(View.GONE);
}
@Override
public void toMainActivity(UserInfo info) {
startActivity(new Intent(LoginActivity.this, MainActivity.class).putExtra("USER_INFO", info));
}
@Override
public void loginFailure(String msg) {
Toast.makeText(LoginActivity.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void clearUsername() {
mUserNameEt.setText("");
}
@Override
public void clearPassword() {
mPasswordt.setText("");
}
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.btn_login:
mPresenter.login();
break;
case R.id.btn_clear:
mPresenter.clear();
break;
default:
break;
}
}
}
最后,在presenter中实现涉及到的逻辑操作封装接口并实现
public interface ILoginPresenter {
void login();
void clear();
}
public class LoginPresenter implements ILoginPresenter{
protected ILoginView mLoginView;
protected Handler handler=new Handler();
public LoginPresenter(ILoginView mLoginView) {
this.mLoginView = mLoginView;
}
@Override
public void login() {
mLoginView.showProgress();
/**
* 在异步任务中更新ui
*/
UserManager.getmInstance().login(mLoginView.getUsername(), mLoginView.getPassword(), new RequestDataCallback() {
@Override
public void onSuccess() {
handler.post(new Runnable() {
@Override
public void run() {
mLoginView.hideProgress();
mLoginView.toMainActivity(UserManager.getmInstance().loadCurrentUserInfo());
}
});
}
@Override
public void onFailure(final String msg) {
handler.post(new Runnable() {
@Override
public void run() {
mLoginView.hideProgress();
mLoginView.loginFailure(msg);
}
});
}
});
}
/*
在ui线程中更新ui
*/
@Override
public void clear() {
mLoginView.clearPassword();
mLoginView.clearUsername();
}
}
好了,整个模块就写完了,现在看一下整个接口,是不是条理更清晰,结构更分明了呢?
详细的研究,之后有时间会追加上来,关键就是利用接口封装逻辑操作,从而使项目可读性更强
本项目已经上传到github,具体地址为https://github.com/nickming/AndroidMVPDemo