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层的逻辑层就可以了,思路更清晰,代码更直观。