android学习日记 MVP开发模式初步详解

android学习日记 MVP开发模式初步详解


前言

随着app功能越来越多,传统的MVC模式已经不再适用,传统的MVC开发模式 activity充当V和C的角色,随着更新换代,内容变得极其臃肿,极其难维护,所以为了更好地维护项目,所以根据MVC衍生出了MVP开发模式,下面我根据自己的理解整理一下自己的思路:MVP开发模式到底是怎么来的。

一、MVP是什么?

	传统的MVP开发模式指的是从activity界面里的逻辑模块抽出来组成了presenter,M层Moudel负责获取
	数据,通过p层的联系通过回调函数显示在V层上(activity)而p层中用于建立mv两层的联系衍生出了
	contract接口,来实现mv互通的通道

二、使用步骤

下面以登录模块示例:

1、编写Logincontract 用于M层和V层回调实现具体功能

package com.example.practice.contract;

import com.example.practice.moudel.LoginMoudel;

public interface LoginContract {
        //编写V层接口 用于V层判断与跳转页面
        interface ILoginActivity {
           void checkLogin(String str);
        }
        /**
         * 编写M层接口 利用V层给出的密码和用户名调用http接口查询是否有此用户的信息
         * 返回并赋值给p层 p层中拿到参数后调用V层的赋值/跳转接口 V层实现接口并做出反应
         * */
         /**这里的参数为
         * 获取到的用户名和密码,还有一个在Moudel的接口类,V通过 p类 p调用这个方法,
         * 获取到M的数据后 重新调用V的checkLogin方法*/
        interface ILoginMoudel{
            void checkNameAndPwd(String name, String pwd,LoginMoudel.JsonListener listener);
        }
}

2、创建p层 建立M层和V层的联系

package com.example.practice.presenter;

import com.example.practice.LoginActivity;
import com.example.practice.contract.LoginContract;
import com.example.practice.moudel.LoginMoudel;

public class LoginPresenter {
        //通过各自的接口类为参数 用到的时候直接实现接口然后回调给需要的一方
        LoginContract.ILoginActivity iLoginActivity;
        LoginContract.ILoginMoudel iLoginMoudel;

    //传过来的 的是V层的上下文
    public LoginPresenter(LoginActivity loginActivity) {
        this.iLoginActivity = loginActivity;
        this.iLoginMoudel = new LoginMoudel();
    }

    //此处为V层需要数据时添加的获取数据的方法
    /**
     * 我们可以看到 用户对V层给出的方法是用户名和密码
     * 这时候调用M层的接口类 通知M层 M层实现接口 在M层编写获取数据方法(比对http获取的数据)
     * 回调给V层执行判断并对用户做出回应
     * */
    public void checkUser(String name, String pwd) {
        iLoginMoudel.checkNameAndPwd(name, pwd, new LoginMoudel.JsonListener() {
            //回调给V层的函数
            @Override
            public void callbackJsonStr(String jsonStr) {
                iLoginActivity.checkLogin(jsonStr);
            }
        });
    }
}

3、编写M层 获取数据,回调给V层

package com.example.practice.moudel;

import android.util.Log;
import com.example.practice.contract.LoginContract;
import com.example.practice.util.OkhttpUtil;
import java.util.HashMap;
import java.util.Map;

//实现Contract里的接口 ,目的是实现V层P层要的数据 引入M层获取数据
public class LoginMoudel implements LoginContract.ILoginMoudel {
    //实现接口
    @Override
    public void checkNameAndPwd(String name, String pwd,JsonListener listener) {
       new Thread(new Runnable() {
           @Override
           public void run() {
               Log.e("aaa","Moudel接收到的用户名:"+name);
               Log.e("aaa","Moudel接收到的密码:"+pwd);
               Map<String,String> map = new HashMap<>();
               map.put("name",name);
               map.put("password",pwd);
               Log.e("aaa","map里的值,name:"+map.get("name")+",密码:"+map.get("pwd"));
               String result =  OkhttpUtil.post("请求的Url",map);
               listener.callbackJsonStr(result);
           }
       }).start();
    }
    /**
     * 此接口 目的是方便回调给V层
     * 首先调用上面的checkNameAndPwd时 得到了数据
     * 那么数据怎样才会被V层接收到呢
     * 就是通过JsonListener的接口 当checkNameAndPwd.callbackJsonStr时传入数据
     * 会去找JsonListener的实现类 找到的类正好就是 LoginPresenter下的checkNameAndPwd
     * new 的 JsonListener 然后在JsonListener下 回调LoginActivity的checkUser接口
     * 接口再次找到自己的实现类LoginActivity.这次参数终于有了值。
     * */
    public interface JsonListener{
            void callbackJsonStr(String jsonStr);
    }
}

4、编写V层 与用户交互

package com.example.practice;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.practice.contract.LoginContract;
import com.example.practice.presenter.LoginPresenter;

public class LoginActivity extends AppCompatActivity implements LoginContract.ILoginActivity {
    private Button btn;
    private EditText name_edt,pwd_edt;
    LoginPresenter loginPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        init();
        //与  LoginPresenter 关联
        loginPresenter = new LoginPresenter(this);
        //获取用户输入的值
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = name_edt.getText().toString();
                String pwd  = pwd_edt.getText().toString();
                Log.e("aaa","输入的用户名:"+name);
                Log.e("aaa","输入的密码:"+pwd);
                //调用LoginPresenter的方法 通知M层获取数据
                loginPresenter.checkUser(name,pwd);
            }
        });
    }
    private void init() {
        btn = findViewById(R.id.btn);
        name_edt = findViewById(R.id.name_edt);
        pwd_edt = findViewById(R.id.pwd_edt);
    }
    //回调 拿到数据做处理
    @Override
    public void checkLogin(String str) {
        if (str!=null){
            Log.e("aaa",str+"");
            startActivity(new Intent(LoginActivity.this,NewActivity.class));
        }
    }

}

总结

本文的重点 主要在M层和P层,MP做的工作主要是用户看不到的逻辑类工作,V层的工作主要是与用户交互。MVP可以更好地与分离M层和V层 各司其职,超解耦,编写大型项目时,只修改M层或P层的逻辑层就可以了,思路更清晰,代码更直观。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值