之前开发的项目都是将网络请求、界面更新写在Activity中,也很少有抽取封装,久而久之Activity变得十分臃肿,很难维护,类与类之间耦合严重,往往牵一发而动全身,遂研究了下MVP模式,感觉比传统MVC好了不少。
废话不多说上代码(登录界面)
/**
* 定义一个接口,定义操作UI抽象方法
*/
public interface LoginView {
void showProgress();
void hideProgress();
void showMsg(String message);
void jumpToHome();
}
Activity 实现上面的接口
/**
* Activity需要持有一个Presenter对象,将逻辑处理放在Presenter中
*/
public class LoginActivity extends BaseActivity
implements LoginView {
@BindView(R.id.progress)
ProgressBar mProgressBar;
@BindView(R.id.username)
EditText mUserName;
@BindView(R.id.password)
EditText mPassWord;
@BindView(R.id.btn)
Button mButton;
private LoginPresenterImpl mLoginPresenter;
@Override
public int getLayoutId() {
return R.layout.activity_login;
}
@Override
public void showProgress() {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
mProgressBar.setVisibility(View.GONE);
}
@Override
public void showMsg() {
Tools.showToast(getString(R.string.loginSucc));
}
@Override
public void jumpToHome() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
@OnClick({R.id.btn})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn:
presenter.login(mUserName.getText().toString(), mPassWord
.getText().toString());
break;
}
}
}
presenter接口,声明登录逻辑
/**
* Presenter接口,声明了登陆的逻辑处理接口
*/
public interface LoginPresenter {
void login(String username, String password);
}
登录结果回调接口
/**
* 登录结果回调接口
*/
public interface RequestCallBack {
void beforeRequest();
void success();
void onError();
}
Presenter的具体实现,同时持有View和Interator的引用,处理UI响应,数据处理等,不关心具体操作与实现,只相当于粘合剂,解耦作用
public class LoginPresenterImpl implements LoginPresenter,
RequestCallBack {
private LoginActivity mView;
private LoginInteractor mInteractor;
public LoginPresenterImpl(LoginView mView) {
this.mView= mView;
this.mInteractor= new LoginInteractorImpl();
}
@Override
public void login(String username, String password) {
mView.showProgress();
mInteractor.login(username, password, this);
}
@Override
public void beforeRequest() {
mView.showProgress();
}
@Override
public void onError() {
mView.hideProgress();
}
@Override
public void onSuccess() {
mView.showMsg();
mView.jumpToHome();
}
}
处理登陆业务的接口
public interface LoginInteractor {
Subscription login(String username, String password, RequestCallBack callback);
}
InteractorImpl处理具体登陆业务逻辑
public class LoginInteractorImpl implements LoginInteractor {
@Override
public Subscription login(final String username, final String password, final RequestCallBack callback) {
return Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscribersubscriber) {
subscriber.onNext();
subscriber.onCompleted();
}
})
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.onError();
}
@Override
public void onNext() {
callback.success();
}
});
}
}