Android中的MVC和MVP
来源:互联网 发布:淘宝店铺装修素材图 编辑:程序博客网 时间:2024/06/10 09:11
一、什么是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<String>{ 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<IBaseView> { 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<V extends IBaseView> { 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<T> { void login(T t);}
github项目地址
- Android中的MVC和MVP
- Android中的MVC和MVP(分析+实例)
- Android中的MVC和MVP对比
- Android中的MVC和MVP(分析+实例)
- Android中的MVC和MVP模式
- Android中的MVC,MVP和MVVM
- Android MVC 和 MVP
- 谈谈android中的MVC,MVP和MVVM MVC
- Android中的MVC与MVP
- Android 中的MVC、MVP、MVVM
- 小议Android开发中的MVC,MVP和MVVM
- Android中的MVC和MVP模式的简单理解
- android中的MVC,MVP和MVVM模式简单总结
- Android开发中的mvc、mvp、mvvp模式
- 浅谈Android中的MVC与MVP模式
- Android中的MVC、MVP、MVVM简介
- iOS中的MVC和MVP的区别
- [Android]对MVC和MVP的总结
- textView展开收回
- JavaSE基础篇(四)
- angular directive详解之transclude
- 国内无线频谱资源分配图集
- Android学习第二篇;模块化编译
- Android中的MVC和MVP
- 微信jsapi获取用户地理位置接口开发(第八课)
- 微信公众号OAuth 点击菜单按钮 跳转页面授权 获取openid
- Android Studio中简单的设置-字体风格等
- mark----android光感距离感详解
- 关于Unity如何创建静态动画图片
- bccomp()比较两个数字的大小
- laravel lang多语言本地化处理
- 深入理解DB2索引(Index)