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);
}
}