Mvp 理解与应用:
个人对MVC 和MVP理解:
M–>model
V–>view Activity
C–>Control
之前开发中我们直接在Activity中就会处理逻辑,导致Activity的类很庞大。
所以google官方推出了MVP模式开发。
M -->model
V–>View Activity
p–>Presenter
V --> P -->M :v直接下发指令到P 然后调用model处理
V<--(回调)p <--M model获取到数据后通过view的接口回调给View
###根据代码在去理解这个模式的写法
2.写了一个登陆功能,用MVP模式:
简单说明:
--LoginIngerface 接口就是Activity里面处理UI的接口。
–ModeInterface 接口就是处理数据的接口,需要传入更新的UI接口。
–ModeImple 类实现ModeInterface接口,进行逻辑处理,根据逻辑处理调用相关的View 回调函数。
--present 只做代理,会持有View的接口,在present里面去初始化(new)一个Mode实例。
--在present中可以直接调用Mode里面的函数,进行封装供 UI层调用。
UI层只需要实现LoginIngerface接口,设置监听即可。UI层就不会处理相关逻辑了
/**
* Created by ybf on 2019/3/29.
* View 的回调接口
*/
public interface LoginIngerface {
void onSuccess();
void onFail();
String getUserName();
String getPassWord();
}
/**
* Created by ybf on 2019/3/29.
* 数据处理的接口
*/
public interface ModeInterface {
void login(LoginIngerface longin);
}
/**
* Created by ybf on 2019/3/29.
*/
public class ModeImple implements ModeInterface {
/**
* 登陆判断逻辑在Mode 里面处理,通过model 接口回调给present
* Mode 持有view的 引用,(m和v连接启动,都是通过接口方式)
* @param longin
*/
@Override
public void login(LoginIngerface longin) {
String userName = longin.getUserName();
String password = longin.getPassWord();
if(userName.equals("admin") || password.equals("admin")){
longin.onSuccess();
}else {
longin.onFail();
}
}
}
package app.ybf.com.mvp.Login;
/**
* Created by ybf on 2019/3/29.
* MVP
* M层定义接口,就是longin的接口,写一个M的实现类。
* present只做代理,不处理逻辑。
*
* Presenter扮演着view和model的中间层的角色。
* 获取model层的数据之后构建view层;
* 也可以收到view层UI上的反馈命令后分发处理逻辑,交给model层做业务操作。
* 它也可以决定View层的各种操作。
*/
public class present {
public LoginIngerface longin;
public ModeInterface modeInterface;
/**
* 设置UI监听
* @param longin 哪个View调用我们,就需要传哪个View的参数
*/
public void setPresentLinister(LoginIngerface longin){
this.longin = longin;
modeInterface = new ModeImple();//new出我们业务处理接口的具体实现类
}
public void Login (){
modeInterface.login(longin);
}
}
package app.ybf.com.mvp.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import app.ybf.com.mvp.Login.LoginIngerface;
import app.ybf.com.mvp.Login.present;
import app.ybf.com.mvp.MyApplication;
import app.ybf.com.mvp.R;
import app.ybf.com.mvp.Utils.LogUtils;
import app.ybf.com.mvp.Utils.SharedPreferencesHelper;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* Created by ybf on 2019/3/26.
*/
public class SplashActivity extends Activity implements LoginIngerface {
@BindView(R.id.et_username)
EditText etUsername;
@BindView(R.id.et_password)
EditText etPassword;
@BindView(R.id.btn_enter)
Button btnEnter;
private String TAG = getClass().getSimpleName();
private boolean isFrist = false;
private boolean isopen = false;
private present mpresent;
/**
* 1.进入splashActivity 页面
* 2.判断是否第一次开启,如果是第一次开启进入guide引导页面
* 3.如果不是第一次则进入MainActivity
*
* @param savedInstanceState
*/
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isFrist = SharedPreferencesHelper.getInstance(this).getBooleanValue("isFrist");
LogUtils.i(TAG, "isFrist open :" + isFrist);
if (isFrist) {
startActivity(new Intent(this, GuideActivity.class));
finish();
SharedPreferencesHelper.getInstance(this).putBooleanValue("isFrist", false);
return;
}
setContentView(R.layout.activity_splas);
ButterKnife.bind(this);
findViewById(R.id.Ly_splash).setBackgroundResource(R.mipmap.bg_f);
mpresent = new present();
mpresent.setPresentLinister(this);
}
/**
* 延时2秒进入主界面
*/
public void enterMainActivity(int times) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
statrMainActivity();
}
}, times);
}
public void statrMainActivity() {
startActivity(new Intent(this, MainActivity.class));
MyApplication.isopen = true;
finish();
}
@Override
public void onSuccess() {
if (MyApplication.isopen) {
enterMainActivity(0);
} else {
enterMainActivity(2000);
}
}
@Override
public void onFail() {
Toast.makeText(MyApplication.getInstance(), "密码错误", Toast.LENGTH_SHORT).show();
}
@Override
public String getUserName() {
return etUsername.getText().toString().trim();
}
@Override
public String getPassWord() {
return etPassword.getText().toString().trim();
}
@OnClick(R.id.btn_enter)
public void onClick() {
mpresent.Login();
}
}