浅谈MVP实战及图解、各种变种详细记录

学习的目标是什么?思想是什么?下面就跟我一起看看吧。

一、view层即就是activity层要做什么?

1、findViewById、获取控件数据getText().toString()、绑定事件,控件显示隐藏、展示进度条、弹出对话框和Toast、以及给控件设置数据和设置颜色变化,界面跳转等。这些都是必须要在activity中做的,没法抽离。

二、Presenter层要干什么?怎样完成的?

1、负责调用view层实现的方法、调用model层处理业务的方法或者调用自身处理业务的方法、使得view层和model层能够交换数据。主要通过维护的ViewInterface的实现activity对象调用实现的方法、调用model层的方法。另外还可以通过入口方法接收activity中的参数,但这样修改起来没有接口获得参数灵活

三、model层要做什么?能做什么?

1、封装基本数据、封装业务处理逻辑、封装网络请求逻辑、封装数据转换逻辑。

这样做的好处是什么?为什么要这样做?

原因很简单:低耦合高内聚,特别适合多个app同一套登录业务之类的


参数如何传给model层?

1、presenter的构造方法

2、presenter中定义的入口方法

3、利用activity实现的接口,注意activity就是context对象,必须每次都更新view层对象否则activity切换会导致View层对象回调会出现问题。


下面详细看每一种的图解和简单Demo吧!

第一种:特点完全通过接口获取所有数据和设置所有数据

代码实现:

接口定义:

public interface LoginViewInterface {

    //获取账号

    String getUserName();

    //获取密码
   String getPassword();

   //消息通知
  void notifyMessage(String message);

 //改变显示的样式
 void changeUI();

//展示进度条
    void showProgress();
    //取消进度条
    void dismissProgress(); 

    //跳转至主页的方法
    void goActivity();

    void onSuccess(ResponseObject resInfo) throws Exception;
}

Persenter定义:

public class LoginPresenter {

    public LoginModel loginModel;

    public LoginViewInterface loginViewInterface;

    public BaseViewInterface baseViewInterface;

 

    public static LoginPresenter presenter;

 

    public static LoginPresenter getInstance(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {

      
            //每次最好更新loginViewInterface防止activity关闭,持有的对象地址出现问题
            presenter = new LoginPresenter(loginViewInterface, baseViewInterface);
    

        return presenter;

    }
    private LoginPresenter(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {

        this.loginViewInterface = loginViewInterface;

        this.baseViewInterface = baseViewInterface;

        loginModel = new LoginModel();//处理逻辑的model

    }

    //这是Presenter入口掉用

    public void userLogin("这里可以为presenter传参数,然后传给model层,而不使用接口") {

        String isSuccess = loginModel.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword());

        if(isSuccess){

              loginViewInterface.goActiviy();}}}
 activity定义

public class Login2Activity extends BaseActivity implements LoginViewInterface

activity中调用:

//这是调用,因为这里用到了BaseActivity所有多传了个参数

LoginPresenter.getInstance(Login2Activity.this,Login2Activity.this).userLogin()


第二种:不同的是很多参数通过Presenter构造方法传参,不太灵活,详细就不写代码了主要修改的是构造方法,需要重载多个构造方法。




第三种:通过改造Presenter和Model,来达到目的,即就是让Model实现ModelInterface接口,然后在Presenter中让接口指向具体model。



代码实现:

model需要实现ModelInterface
public class LoginModel implements LoginModelInterface 

Presenter中构造方法:
loginModelInterface = new LoginModel();



第四种:



第五种:这种不同的是吧控制的一部分通过Presenter回调,分到model中,需要在Presenter中增加内部接口,需要在model中业务处理的方法中添加Presenter回调接口这种相对比较繁琐,Presenter仅仅作为桥梁的作用不做任何处理和逻辑。



代码实现:

这是Presenter中定义的回调接口
public interface CallBack {
        void onSuccess(String message);

        void onFailed(String error);

        void changeUI();

        void setConnectNetwork();

        void goActvity();

        void showProgress();

        void dismissProgress();

        void getResult(String result);
    }

接下来不同的是model:

public void userLogin(String userName, String password, LoginPresenter.CallBack callBack)
//这样就可以通过callBack回调Presenter接口中的方法了

Presenter入口方法中调用:

public void userLogin() {
        loginModelInterface.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword(), new CallBack() {
            @Override
            public void onSuccess(String message) {
                try {
                    loginViewInterface.onSuccess(resInfo);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailed(String error) {
                loginViewInterface.notifyMessage(error);
            }

            @Override
            public void changeUI() {
                loginViewInterface.changeUI();
            }

            @Override
            public void setConnectNetwork() {
                baseViewInterface.setNetConnection();
            }

            @Override
            public void goActvity() {
                loginViewInterface.goActivity();
            }

            @Override
            public void showProgress() {
                loginViewInterface.showProgress();
            }

            @Override
            public void dismissProgress() {
                loginViewInterface.dismissProgress();

            }

            @Override
            public void getResult(String result) {
                try {
                    resInfo = baseViewInterface.getResult(result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

第六种:将所有业务处理都放在Presenter中,比如网络请求,具体业务处理,这样业务的重用度比较低。



相对的还有很多改变,根据业务的复杂度,业务的可划分度自行划分和分层调用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值