一、什么是mvc和mvp
mvc:mvc就是model,view,controller。Android中modle毫无疑问大家都知道的就是数据实体了,view就是视图组件比如listview,viewpager等等。Controller控制器,view和modle交互由controller处理,由activity充当controller角色。
mvp:modle,view,presenter。同mvc开发模式一样modle就是数据实体,view是activity,presenter是自定义主导器,modle和view的交互由它来实现。
二、区别和优缺点
两者区别
Mvc开发模式的controller由activity充当,实际activity除了处理modle和view交互以外还处理视图初始化工作,因此它的功能并不单一。如果业务逻辑十分复杂的情况下会导致activity变的很臃肿和不易维护。
Mvp 开发模式activity作为view通过presenter中间者来实现与modle交互,很好的实现了解耦和,大大加强了项目扩展性和易维护性。
优缺点
Mvc与mvp相比不需要创建中间者presenter,会减少很多接口文件,对于功能简单的项目来说比较适合,快速敏捷。但是对于大型项目,业务和功能都十分复杂,mvc的维护性,扩展性,甚至代码易读性就会显得很差。
综合来说,还是推荐使用mvp开发模式,当然就像前面提到的功能简单的小项目可以采用mvc更快速的去开发一个项目。
三、代码演示
因为我们开发使用mvc已经非常熟练了,所以这里主要展示mvp开发。
比如我们要实现一个登录功能,需要有登录页面
mvp代码基本编写流程:
1. 编写view也就是Activity
注:通常继承于BaseActivity实现IBaseView(定义通用属性行为)
2. 根据view相关业务定义接口并使其实现
注:因为presetner处理m与v交互,所以持有的引用类型就是这里的接口类型。
3. 定义present
注:通常会定义一个抽象basepresenter定义通用属性行为,生命周期方法。
4. 将view业务接口类型引用和model引用交给presenter实现交互。
LoginActivity.java
public class LoginActivity extends BaseActivity implements View.OnClickListener ,ILoginView{
private Button mLoginBtn;
private LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentLayout(R.layout.activity_main);
}
@Override
public void getViews() {
mLoginBtn = (Button) findViewById(R.id.btn_login);
}
@Override
public void bindData() {
}
@Override
public void setListeners() {
mLoginBtn.setOnClickListener(this);
}
@Override
public void showToast(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
showLoadingLayout();
mLoginPresenter.login();
break;
}
}
@Override
public BasePresenter getPresenter() {
if(mLoginPresenter==null) {
mLoginPresenter = new LoginPresenter(this,this,this);
}
return mLoginPresenter;
}
@Override
protected void onDestroy() {
super.onDestroy();
mLoginPresenter.onDestroy();
}
@Override
public void login(String msg) {
showToast(msg);
}
}
model和view需要通过presenter实现交互。因此Presenter需要持有model和view的引用,为了更好的服用和扩展,presenter和activity都定义了抽象父类,baseactivity实现了IbaseView接口定义通用的行为,loginActivity实现了ILoginView接口定义了View具体的业务属性。
LoginPresenter
public class LoginPresenter extends BasePresenter {
public static final String LOGIN_TAG = "login_tag";
private final ILoginView mLoginView;
public LoginPresenter(Context context, IBaseView callbackView, ILoginView loginView) {
super(context,callbackView);
this.mLoginView = loginView;
}
public void login() {
// 模拟延时操作
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
EventBus.getDefault().post("登录成功");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLogin(String msg) {
mLoginView.login(msg);
mViewCallBack.hideLoadingLayout();
}
@Override
public void onCreate() {
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
mViewCallBack = null;
EventBus.getDefault().unregister(this);
}
}
BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements IBaseView {
private FrameLayout mParentLayout;
private ProgressBar mLoadingPb;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_layout);
initViews();
if(null!=getPresenter()) {
getPresenter().onCreate();
}
}
@Override
public void initViews() {
mParentLayout = (FrameLayout) findViewById(R.id.fl_content);
mLoadingPb = (ProgressBar) findViewById(R.id.pb_loading);
}
@Override
public void setContentLayout(int resId) {
View.inflate(this,resId,mParentLayout);
getViews();
bindData();
setListeners();
}
@Override
public void showLoadingLayout() {
mLoadingPb.setVisibility(View.VISIBLE);
}
@Override
public void hideLoadingLayout() {
mLoadingPb.setVisibility(View.GONE);
}
public abstract BasePresenter getPresenter();
public abstract void getViews();
public abstract void bindData();
public abstract void setListeners();
@Override
protected void onDestroy() {
super.onDestroy();
if(null!=getPresenter()) {
getPresenter().onDestroy();
}
}
}
BasePresenter
public abstract class BasePresenter {
protected Context mContext;
protected V mViewCallBack;
public BasePresenter(Context context,V viewCallBack) {
this.mContext = context;
this.mViewCallBack = viewCallBack;
initModel();
// onCreate();
}
public void initModel() {}
public abstract void onCreate();
public abstract void onDestroy();
}
IBaseView 定义BaseActivity通用属性行为
public interface IBaseView {
void initViews();
void setContentLayout(int resId);
void showToast(String msg);
void showLoadingLayout();
void hideLoadingLayout();
}
ILoginView 定义了LoginActivity基本业务属性。
public interface ILoginView {
void login(T t);
}
github项目地址