MVP架构 + EventBus 构建项目这篇文章写得很简洁了,感谢作者。
以下内容为转抄。
使用MVP架构 + EventBus 构建项目
最近项目重构,从MVC架构换到MVP架构,好处是多多的,当然有利有弊。
利:解耦,提高代码可维护性,减轻Activity和Fragment类的重担。
弊:增加代码量,增加许多类。
接下来简单的介绍下吊炸天MVP模式,先看一张图:
Model层:和MVC的Model层一样,对数据进行操作,请求数据,增删改查数据等。
View:界面层,负责展示界面,显示一张图片,显示一个Dialog等。
Presenter层:View层和Model层的桥梁,因为在MVP架构中,View层和Model层完全隔离,View只能通过Presenter层来操作数据。
EventBus 的使用: Model层 使用 EventBus 向 Presenter层 传递数据。
添加EventBus 3.0 依赖:
compile 'de.greenrobot:eventbus:3.0.0-beta1'
实现步骤 (这里以登录案例来说明)
获取用户输入的数据,去请求服务器获得反馈;这里额外添加进入页面首先访问服务器拿一些数据。
1:创建 View层和 Presenter层接口,通常包括一些通用接口方法,可以提取到基类接口。
BaseView:
public interface BaseView<T> {
/**
- 给View设置Presenter
@param presenter
*/
void setPresenter(T presenter);
}
BasePresenter:
public interface BasePresenter {
/**
* 初始化
*/
void start();
/**
* 结束
*/
void stop();
}
2:然后根据不同的业务创建不同的Contract
LoginContract:
public interface LoginContract {
interface Presenter extends BasePresenter {
/**
* 执行登录动作
*/
void login();
}
interface View extends BaseView<Presenter> {
/**
* 显示服务器返回的数据
* @param serviceInfo
*/
void showServiceInfo(ServiceInfo serviceInfo);
/**
* 获取用户输入的数据
* @return 用户数据
*/
String getName();
String getPassword();
/**
* show Toast
* @param text
*/
void showToast(String text);
/**
* 显示ProgressBar
*/
void showProgressBar();
/**
* 隐藏ProgressBar
*/
void hindProgressBar();
}
}
3:创建登录LoginActivity实现LoginContract.View接口,创建LoginPresenter实现LoginContract.Presenter接口。
LoginActivity:
public class LoginActivity extends AppCompatActivity implements LoginContract.View, View.OnClickListener {
private EditText mEtName;
private EditText mEtPassword;
private Button mBtnLogin;
private ProgressBar mPbProgress;
private TextView mTvServiceInfo;
private LoginContract.Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtName = (EditText) findViewById(R.id.etName);
mEtPassword = (EditText) findViewById(R.id.etPassword);
mTvServiceInfo = (TextView) findViewById(R.id.tvServiceInfo);
mBtnLogin = (Button) findViewById(R.id.btnLogin);
mPbProgress = (ProgressBar) findViewById(R.id.pbProgress);
mBtnLogin.setOnClickListener(this);
// 绑定Presenter
new LoginPresenter(this);
mPresenter.start();
}
@Override
public void setPresenter(LoginContract.Presenter presenter) {
this.mPresenter = presenter;
}
@Override
public void showServiceInfo(ServiceInfo serviceInfo) {
mTvServiceInfo.setText(serviceInfo.getSeviceInfo());
}
@Override
public String getName() {
return mEtName.getText().toString().trim();
}
@Override
public String getPassword() {
return mEtPassword.getText().toString().trim();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnLogin:
mPresenter.login();
break;
}
}
@Override
public void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
@Override
public void showProgressBar() {
mPbProgress.setVisibility(View.VISIBLE);
}
@Override
public void hindProgressBar() {
mPbProgress.setVisibility(View.GONE);
}
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.stop();
}
}
LoginPresenter:
public class LoginPresenter implements LoginContract.Presenter {
LoginContract.View mLoginView;
public LoginPresenter(LoginContract.View loginView) {
this.mLoginView = loginView;
mLoginView.setPresenter(this);
}
@Override
public void start() {
EventBus.getDefault().register(this);
new ServiceInfoModelImpl().getServiceInfo();
}
@Subscribe(threadMode = ThreadMode.MainThread)
public void eventBusResult(ResultBean bean) {
// 根据不同返回数据,做不同的操作
switch (bean.getAction()){
case ServiceInfoModelImpl.ACTION_GET_SERVICE_INFO:
mLoginView.showServiceInfo((ServiceInfo) bean.getObject());
break;
case UserInfoModelImpl.ACTION_LOGIN:
mLoginView.hindProgressBar();
mLoginView.showToast((String)bean.getObject());
break;
}
}
@Override
public void login() {
UserInfo userInfo = new UserInfo();
String name = mLoginView.getName();
String password = mLoginView.getPassword();
if(TextUtils.isEmpty(name) || TextUtils.isEmpty(name)){
mLoginView.showToast("name or password can not be null");
return;
}
mLoginView.showProgressBar();
userInfo.setName(name);
userInfo.setPassword(password);
// 调用Model层登录
new UserInfoModelImpl().login(userInfo);
}
@Override
public void stop() {
EventBus.getDefault().unregister(this);
mLoginView = null;
}
}
总结:
MVP架构的优点是毋庸置疑的,它适合在一些中大型项目中使用,小项目没必要使用;这篇只是本人对MVP架构的浅见,如有错误,那就对了。