MVP模式 Android

为什么说MVP呢?
是因为传统的MVC架构在Android开发中显得不是那么合适;
在Android开发中
XML布局作为View
Activity,Fragment等作为Controller
数据处理那块都是一样 Model

但是由于View层XML功能是在太弱,
导致本该作为Controller的Activity,Fragment必须承担很多View本该实现的功能,
这也就导致随着界面的复杂,项目的扩大,会发现你的Activity里面的代码越来越多,因为里面既包含了对界面的显示控制,也包含了业务的逻辑控制,

所以MVP开发模式在Android上变的流行,以至于后面google官方也是提供MVVM模式来简化Android开发,MVVM也算对MVP的升级的,自带数据绑定。先谈谈我对MVP的理解。

这里来先说一下MVC模式和MVP的最大区别
就是V和M的联系
MVC中V是可以关联M M也可以直接通知到V
MVP中 V 和M之间的联系必须通过Presenter

至于说MVP较MVC的优点,
因为MVC本来就是经典的开发模式,MVP也是在MVC的基础上衍生出来的
所以只能说是MVP在Android开发中比MVC要好的地方

1:V和M可以完全分离用户界面,使得单元测试更加方便
2:也就是将Activity的代码量减少,不用随着项目的扩大出现很多庞大的Activity

缺点:
在我看来 就在我的Demo中一个很小的例子
就一个Activity就意味着一个View
一个View要在Presenter Model View各个地方都创建一个Interface
P中关联V和M 这样可以能写起来比较繁琐,耗费的时间更多,当然这是不可避免的,要将逻辑从Activity中分离只能抽取,而且要关联V和M 这样是必须的,这也是为了后期的扩展和维护打好地基

我也在想会不会是这样的原因导致MVP现在其实也没有在很多项目中运用,因为对于开发者来讲,并不是每一个人都会接受这种写法,

而且google后面官方推出的是MVVM
MVVM算是对MVP的升级吧,或者说是一个 把里面一个要我们自己实现接口来更新数据,封装好了成为数据绑定,这样大大简化了我们要创建的接口数

我并没有在项目中用过,只是想了解一下
因为对于开发来讲MVVM的可能是更好地选择,尤其是在官方支持之后,我想我们选择的应该是MVVM 但是MVp这种思想

通过一个Demo来
Demo不是我自己想出来 也是看了网上的资料模仿着写的

整体的一个结构
这里写图片描述

一个MainActivity对应一个MainView 对应一个Model 一个Presenter

先声明几个接口

View

public interface MainView {
void showLoading();
void hidenLoading();
void showError();
void setResult(String result);
}

Presenter

public interface MainPresenter {
void getWeather(String str);
void onOK(String result);
void onError();
}

Model

public interface MainModel {
     void loadData(String str,MainPresenter mainPresenter);
}

实现类
Model

public class MainModelImpl implements MainModel {

WeakHandler handler = new WeakHandler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        String result= (String) msg.obj;

        mainPresenter.onOK(result);

        return false;
    }
});

private MainPresenter mainPresenter;

@Override
public void loadData(String cityNO, final MainPresenter mainPresenter) {
         /*数据层操作*/

    this.mainPresenter=mainPresenter;

    new Thread(new Runnable() {
        @Override
        public void run() {
            SystemClock.sleep(2000);

            Message message=Message.obtain();
            message.obj="天气数据";

            handler.sendMessage(message);
        }
    }).start();
    //为了方便 主线程睡两秒吧
}

}

Presenter

public class MainPresenterImpl implements MainPresenter {

MainView mainView;

MainModel mainModel;

public MainPresenterImpl(MainView mainView){

    this.mainModel = new MainModelImpl();;

    this.mainView = mainView;
}


@Override
public void getWeather(String cityNO) {

    mainView.showLoading();
    mainModel.loadData(cityNO,this);
}

@Override
public void onOK(String result) {
    mainView.hidenLoading();
    mainView.setResult(result);
}

@Override
public void onError() {
    mainView.hidenLoading();
    mainView.showError();
}

}

最后是主代码
MainActivity的代码 实现一个View的接口 然后将自己作为一个对象传入Presenter

public class MainActivity extends Activity implements MainView {
@InjectView(R.id.et_city_no)
TextView etCityNo;
@InjectView(R.id.btn_go)
Button btnGo;
private Dialog loadingDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);
    final MainPresenter mainPresenter = new MainPresenterImpl(this);
    btnGo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mainPresenter.getWeather(etCityNo.getText().toString().trim());
        }
    });
    loadingDialog = new ProgressDialog(this);
    loadingDialog.setTitle("加载数据中...");
}

@Override
public void showLoading() {
    loadingDialog.show();
}

@Override
public void hidenLoading() {
    loadingDialog.dismiss();

}
@Override
public void showError() {
    Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
}
@Override
public void setResult(String result) {
    etCityNo.setText(result);
}

}
基本Demo就是这样

效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值