欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVP andorid 使用

程序员文章站 2022-05-12 20:25:33
...

MVP整理:
参考:https://www.jianshu.com/p/57e5f75e9408
简介:
首先说一下大家都熟悉的mvc,mvc由三部分组成,分别是M-Model-模型、V-View-视图、C-Controller-控制器,随着功能以及业务逻辑的增加,我们希望业务逻辑model和展示层view之间的结构和关系能够更清晰,所以增加了controller,来实现两者之间的部分控制和解耦,三者之间的具体关系如下图
MVP andorid 使用

在MVC中:Model和View代表着业务逻辑与展示方式,Model和View往往是互相引用,改变展示方式的时候很有可能也要修改业务逻辑层,即修改Controller。
因此为了去除这种弊端,需要做解耦,我们的MVP应运而生。
同样MVP也包含三部分
Model:业务逻辑,工作职责是:加载数据。
View:视图,工作职责是:控制显示数据的方式。
Presenter:中间者,绑定Model、View。
MVP andorid 使用

虽然MVP的使用比较麻烦了些,但是它的有点也是很明显的,Model和View充分解耦,修改一个不会牵扯到另外一个。
另外,视图、业务逻辑也有可能会变,因此视图、业务逻辑抽取成接口,改变不同的实现类即可。 Presenter中只持有Model和VIew的引用,可以随时更换它们的实现类,从而实现对扩展是开放的。
因此MVP相对于MVC来说,规范比较明确,在系统架构上扩展性更加强。

具体的Demo:
先看下整个demo的目录结构:
MVP andorid 使用
下面开始分别讲解:
1. 首先作为一个app需要展示数据,那么我们先创建一个目录,专门放Model,为了更好的提高扩展,数据以及显示都是通过接口的方式来实现的,因此需要创建SendMsgModel.

public interface SendMsgModel {
    void sendMsg(String json, String flag,SendMsgListener sendMsgListener);
}

其中需要一个sendMsgListener

public interface SendMsgListener {
      void sendMsgSuccess();
      void sendMsgFail(String msg);
    }
  1. 然后我们需要实现这个接口
public class SendMsgModelImpl implements SendMsgModel{
    @Override
    public void sendMsg(String json, String flag ,final SendMsgListener sendMsgListener) {
        String url = Constant.baseUrl + "AppWebService.do?appGetSms";
        OkHttpUtils
                .post()
                .url(url)
                .addParams("json",json)
                .addParams("flag",flag)
                .build()
                .execute(new ResponseCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        LOG.d("url---------->", e.getMessage());
                        sendMsgListener.sendMsgFail(MyApplication.getInstance().getApplicationContext().getString(R.string.http_request_fail_hint));
                    }

                    @Override
                    public void onResponse(ResponseEntity response, int id) {
                        if(response.isSuccess()){
                            sendMsgListener.sendMsgSuccess();
                        }else{
                            sendMsgListener.sendMsgFail(response.getMsg());
                        }

                    }
                });
    }
}
  1. 接着我们需要View的接口,一个显示进度条,一个隐藏进度条,一个发送成功的方法,一个发送失败的方法。
public interface SendMsgView {
      void showProgress();
      void hideProgress();
      void sendMsgViewSuccess();
     void sendMsgViewFail(String msg);
 }
  1. 我们的Activity是作为View的实现类,因此需要实现View的接口,并且实现里面的抽象方法
  2. 但是上面的activity中并没有与model层进行关联,所以需要有一个中间的控制层,presenter。
public interface SendMsgPresenter {
    void doSendMsg(String json,String flag);
    void onDestroy();
}

.6. 然后我们实现该接口,由于presenter充当view与model的中介,所以presenter在构造方法中会持有model以及view的引用,并实现相关view的方法,以及model的方法。

public class SendMsgPresenterImpl implements SendMsgPresenter ,SendMsgListener {

    private SendMsgModel mSendMsgModel;
    private SendMsgView mSendMsgView;

    public SendMsgPresenterImpl(SendMsgView mSendMsgView) {
        this.mSendMsgView = mSendMsgView;
        mSendMsgModel = new SendMsgModelImpl();
    }

    @Override
    public void sendMsgSuccess() {
        mSendMsgView.hideProgress();
        mSendMsgView.sendMsgViewSuccess();
    }

    @Override
    public void sendMsgFail(String msg) {
        mSendMsgView.hideProgress();
        mSendMsgView.sendMsgViewFail(msg);
    }

    @Override
    public void doSendMsg(String json,String flag) {
        mSendMsgView.showProgress();
        mSendMsgModel.sendMsg(json,flag,this);
    }

    @Override
    public void onDestroy() {
        mSendMsgView = null;
    }
}

.7. 完善第四步,就是在activity中,根据presenter进行model层的操作,以及自己view层的操作

public class MainActivity extends BaseActivity implements SendMsgView{
//    发送短信的Presenter
    private SendMsgPresenter mSendMsgPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册EventBus
        EventBus.getDefault().register(this);
//        初始化Presenter
        initPresenter();

    }

    /**
     * 初始化Presenter
     */
    private void initPresenter(){
        mSendMsgPresenter = new SendMsgPresenterImpl(this);
    }


    /**
     * 截取所需内容
     */
    @SuppressLint("SetTextI18n")
    private void transferValue(String type){
        String json = "";
        if(!json.equals("[]")){
            //检查网络连接
            if(isNetworkConnected(context)){
                mSendMsgPresenter.doSendMsg(json,type);
            }else{
                isSettingDialog(context);
            }
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除绑定
        mSendMsgPresenter.onDestroy();
    }

    @Override
    public void showProgress() {
        LoadingDialogUtils.showDialog(mLoadingDialog);
    }

    @Override
    public void hideProgress() {
        LoadingDialogUtils.closeDialog(mLoadingDialog);
    }

    @Override
    public void sendMsgViewSuccess() {
        ShowToast.showToast("导入成功",context);
    }

    @Override
    public void sendMsgViewFail(String msg) {
        ShowToast.showToast(msg,context);
    }

}

源码地址:https://download.csdn.net/download/silence_sep/10562709

相关标签: MVP Android