MVP 简单使用

MVP项目中的简单使用(一个登录的小功能)

  • model 获取数据源(请求网络数据等)
  • view 即对应Activity,Fragment等
  • presenter 第三者的感觉一只脚踩 M 层,一只脚踩 V 层
  • 在 P 层中通过 V 层接口获取到参数,调用 M 层请求方法,再将 M 层返回数据通过 V 层接口展示给用户(个人感觉不知道对不对哈)

先喽一眼工程文件

在这里插入图片描述
为避免代码多余的情况,写一个公共的接口里面包含一个功能对应的 M V P层

public interface BaseLoginInterface {

    /**
     * 每一个功能对于的公共接口 M V P
     */
    interface loginModel {
        // M 层封装一个登录的方法
        void startLogin(String name, String pwd, DataCallBack callBack);
    }

    interface loginView {
        // V 层封装几个对应的方法
        String getUserName();//获取昵称

        String getUserPwd();//获取密码

        void loginSuccess(String resylt);//登录成功

        void loginFaild(Request request, Exception e);//登录失败
    }

    interface loginPresenter {
        // P 层封装一个方法对应处理 M 层的登录方法
        void handleLoginData();//处理登录接口返回数据
    }
}

M 层:


public class LoginModel implements BaseLoginInterface.loginModel {

    /*
    * M 层的实现类(获取数据源)
    * */
    @Override
    public void startLogin(String name, String pwd, final DataCallBack dataCallBack) {
        //发起网络请求
        //携带参数
//        Map<String,Object> map = new HashMap<>();
//        map.put("name",name);
//        map.put("pwd",pwd);
        NetRequest.getJsonRequest(Api.BaseUrl + Api.toSelectComparyInfo, new DataCallBack() {
            @Override
            public void requestSuccess(String result) throws Exception {
                Log.e("=====","===="+result);
                //如果网络请求成功
                if (!TextUtils.isEmpty(result)) {
                    LoginUserEntity loginUser = new Gson().fromJson(result, LoginUserEntity.class);
                    //用回调将数据带出
                    dataCallBack.requestSuccess(loginUser.getMessage());
                }
            }

            @Override
            public void requestFailure(Request request, IOException e) {
                //如果网络请求失败
                //用回调将数据带出
                dataCallBack.requestFailure(request,e);
            }
        });
    }
}

P 层:

public class LoginPresenter implements BaseLoginInterface.loginPresenter{

    /*
    * P 层的实现类在这里处理数据,
    * 第三者的感觉
     * 一只脚踩 M 层,一只脚踩 V 层
    * */
    //关联 M V
    BaseLoginInterface.loginModel model;
    BaseLoginInterface.loginView view;

    public LoginPresenter(BaseLoginInterface.loginView view) {
        this.view = view;
        model = new LoginModel();//M 层的实现类
    }

    @Override
    public void handleLoginData() {//提供给 V 层调用
        //获取 M 层的数据源(给 V 层用)
        //通过 V 层接口来获取账号密码
        model.startLogin(view.getUserName(), view.getUserPwd(), new DataCallBack() {
            @Override
            public void requestSuccess(String result) throws Exception {
                //通过 V 层接口将成功数据带出
                view.loginSuccess(result);
            }

            @Override
            public void requestFailure(Request request, IOException e) {
                //通过 V 层接口将失败数据带出
                view.loginFaild(request,e);
            }
        });
    }
}

V层:(即Activity)

这里只需实现 V 层接口直接展示数据即可,不需要业务逻辑也就是解耦吧

public class LoginActivity extends AppCompatActivity implements BaseLoginInterface.loginView {

    private EditText etName;
    private EditText etPwd;
    private Button btnLogin;

    Context context;
    private LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        context = this;
        initView();
        //关联 P 层
        loginPresenter = new LoginPresenter(this);
        //开始请求
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginPresenter.handleLoginData();
            }
        });
    }

    private void initView() {
        etName = findViewById(R.id.et_name);
        etPwd = findViewById(R.id.et_pwd);
        btnLogin = findViewById(R.id.btn_login);

    }

    @Override
    public String getUserName() {
        return etName.getText().toString();
    }

    @Override
    public String getUserPwd() {
        return etPwd.getText().toString();
    }

    @Override
    public void loginSuccess(String resylt) {
        Toast.makeText(context, resylt, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginFaild(Request request, Exception e) {
        Log.e("====异常=", "======" + request + "===" + e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值