所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
主要是把业务逻辑拆分出来,让activity中只保留和界面有关的代码。
MVP:view/presenter/model/bean 包名小写
接口的定义以I开头
实现类以Impl结尾
1)view处理与页面有关的逻辑,将Actvity视为View层。
Presenter与View之间的交互是通过接口ILoginView实现的。(数据由presenter————>到activity 中)
Activity中实现IView接口,在其中操作view,实例化一个presenter变量。(数据传递由activity ————>presenter)
2)presenter:model与view的桥梁,让Model和View完全解耦,相互不知道对方的存在,让presenter层负责另外两层的交互。
为presenter 建立构造函数, 持有两个接口的引用。接口成员变量调用其中的方法。
3)model:处理具体的业务逻辑,和实体模型(本质上是读写数据). 建立model,先写接口,后写实现,比如请求网络数据。
在接口定义的所有的抽象方法都是没有返回值的。
Activity中的代码:
package com.example.tuhuadmin.fanxinglei.TestLogin;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.tuhuadmin.fanxinglei.BaseActivity;
import com.example.tuhuadmin.fanxinglei.R;
import com.example.tuhuadmin.fanxinglei.TestLogin.bean.LoginBean;
import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.LoginPresenter;
import com.example.tuhuadmin.fanxinglei.TestLogin.view.ILoginView;
import com.example.tuhuadmin.fanxinglei.utils.ToastUtil;
/**
* Created on 2016/8/5.
* Author:crs
* Description:XXX
*/
public class LoginActivity extends BaseActivity implements View.OnClickListener, ILoginView {
private EditText et_name;
private EditText et_password;
private Button btn_login;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
//当前类如何持有presenter类的引用
loginPresenter = new LoginPresenter(this);
initListener();
}
private void initListener() {
btn_login.setOnClickListener(this);
}
private void initViews() {
et_name = (EditText) findViewById(R.id.et_name);
et_password = (EditText) findViewById(R.id.et_password);
btn_login = (Button) findViewById(R.id.btn_login);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_login: {
String name = et_name.getText().toString();
String password = et_password.getText().toString();
//按照业务逻辑抽取方法
loginPresenter.login(name, password);
}
break;
}
}
@Override
public void loginSuccess(String msg) {
ToastUtil.showLong(LoginActivity.this,msg);
}
@Override
public void loginFail(String strFail) {
ToastUtil.showLong(LoginActivity.this,strFail);
}
}
ILoginView:
package com.example.tuhuadmin.fanxinglei.TestLogin.view;
/**
* Created on 2016/8/5.
* Author:crs
* Description:登录结果回调到activity中
*/
public interface ILoginView {
void loginSuccess(String msg);
void loginFail(String strFail);
}
IloginPresenter:
package com.example.tuhuadmin.fanxinglei.TestLogin.presenter;
/**
* Created on 2016/8/5.
* Author:crs
* Description:XXX
*/
public interface ILoginPresenter {
void loginSuccess(String msg);
void loginFail(String msgFail);
}
LoginPresenter:
package com.example.tuhuadmin.fanxinglei.TestLogin.presenter;
import com.example.tuhuadmin.fanxinglei.TestLogin.model.LoginModelImplement;
import com.example.tuhuadmin.fanxinglei.TestLogin.view.ILoginView;
/**
* Created on 2016/8/5.
* Author:crs
* Description:XXX
*/
public class LoginPresenter implements ILoginPresenter {
com.example.tuhuadmin.fanxinglei.TestLogin.model.ILoginModel ILoginModel;
ILoginView iLoginView;
//通过构造方法,让presenter类持有model和view两个接口的引用
public LoginPresenter(ILoginView iLoginView) {
ILoginModel = new LoginModelImplement(this);
this.iLoginView = iLoginView;
}
//根据业务逻辑定义的方法
public void login(String name, String password) {
ILoginModel.getWorkData(name, password);
}
@Override
public void loginSuccess(String msg) {
iLoginView.loginSuccess(msg);
}
@Override
public void loginFail(String msgFail) {
iLoginView.loginFail(msgFail);
}
}
ILoginModel:主要用于定义具体的业务逻辑接口
package com.example.tuhuadmin.fanxinglei.TestLogin.model;
/**
* Created on 2016/8/5.
* Author:crs
* Description:XXX
*/
public interface ILoginModel {
void getWorkData(String name, String password);
}
LoginModelImplement:
package com.example.tuhuadmin.fanxinglei.TestLogin.model;
import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.ILoginPresenter;
import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.LoginPresenter;
/**
* Created on 2016/8/5.
* Author:crs
* Description:XXX
*/
public class LoginModelImplement implements ILoginModel {
//进行网络数据的请求 处理具体的业务逻辑
public ILoginPresenter iLoginPresenter;
public LoginModelImplement(LoginPresenter loginPresenter) {
this.iLoginPresenter = loginPresenter;
}
@Override
public void getWorkData(String name, String password) {
//获取网络数据操作,bean
if (iLoginPresenter != null) {
//业务逻辑处理完毕
if (name.equals("1111") && password.equals("1111")) {
iLoginPresenter.loginSuccess("登录成功");
} else {
iLoginPresenter.loginFail("登录失败1111");
}
}
}
}