//set?or?get?...
public?User(String?name,?String?password)?{
this.name?=?name;
this.password?=?password;
}
}
3.MVCLoginActivity
//用户点击事件
mvcBinding.mcvLogin.btnLogin.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?v)?{
user.setName(mvcBinding.mcvLogin.etAccount.getText().toString());
user.setPassword(mvcBinding.mcvLogin.etPassword.getText().toString());
login(user);
}
});
//逻辑处理
private?void?login(User?user){
if(!user.getName().isEmpty()&&!user.getPassword().isEmpty()){
if(user.getName().equals("scc001")&&user.getPassword().equals("111111"))
{
Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
}else?{
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
}
MVP实例
代码结构
1.Model层
实体类bean,同MVC中的User类,就不贴代码浪费大家时间了。
Model层所要执行的业务逻辑
/**
*?功能:接口,表示Model层所要执行的业务逻辑
*/
public?interface?LoginModel?{
//User实体类;OnLoginFinishedListener?presenter业务逻辑的返回结果
void?login(User?user,?OnLoginFinishedList
ener?listener);
}
实现类(实现LoginModel接口)
/**
*?功能:实现Model层逻辑
*/
public?class?LoginModelImpl?implements?LoginModel?{
//第4步:验证帐号密码
@Override
public?void?login(User?user,?OnLoginFinishedListener?listener)?{
if(user.getName().isEmpty()||!user.getName().equals("scc001")){
//第5步:Model层里面回调Presenter层listener
listener.onUserNameError();
}else?if(user.getPassword().isEmpty()||!user.getPassword().equals("111111")){
//第5步:Model层里面回调Presenter层listener
listener.onPasswordError();
}else?{
//第5步:Model层里面回调Presenter层listener
listener.onSuccess();
}
}
}
2.Presenter层
当Model层得到请求的结果,回调Presenter层,让Presenter层调用View层的接口方法。
/**
*?功能:当Model层得到请求的结果,回调Presenter层,让Presenter层调用View层的接口方法。
*/
public?interface?OnLoginFinishedListener?{
void?onUserNameError();
void?onPasswordError();
void?onSuccess();
}
完成登录的验证,以及销毁当前View。
/**
*?功能:登录的Presenter的接口,实现类为LoginPresenterImpl,
*?完成登录的验证,以及销毁当前View。
*/
public?interface?LoginPresenter?{
//完成登录的验证
void?verifyData(User?user);
//销毁当前View
void?onDestroy();
}
Presenter实现类,引入 LoginModel(model)和LoginView(view)的引用
/**
*?功能:实现类,引入?LoginModel(model)和LoginView(view)的引用
*/
public?class?LoginPresenterImpl?implements?OnLoginFinishedListener,?LoginPresenter?{
//View层接口
private?LoginView?loginView;
//Model层接口
private?LoginModel?loginModel;
public?LoginPresenterImpl(LoginView?loginView)?{
this.loginView?=?loginView;
this.loginModel?=?new?LoginModelImpl();
}
//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层
@Override
public?void?onUserNameError()?{
if?(loginView?!=?null)?{
//第7步:通过loginView回传到View层
loginView.setUserNameError();
loginView.hideProgress();
}
}
//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层
@Override
public?void?onPasswordError()?{
if?(loginView?!=?null)?{
//第7步:通过loginView回传到View层
loginView.setPasswordError();
loginView.hideProgress();
}
}
//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层
@Override
public?void?onSuccess()?{
if?(loginView?!=?null)?{
//第7步:通过loginView回传到View层
loginView.success();
loginView.hideProgress();
}
}
@Override
public?void?verifyData(User?user)?{
if?(loginView?!=?null)?{
loginView.showProgress();
}
//第3步:调用model层LoginModel接口的login()方法
loginModel.login(user,this);
}
@Override
public?void?onDestroy()?{
loginView?=?null;
}
}
3.View层
布局文件同MVC中的View层,就不贴代码浪费大家时间了。
Presenter与View交互是通过接口。
/**
*?功能:Presenter与View交互是通过接口。
*?接口中方法的定义是根据Activity用户交互需要展示的控件确定的。
*/
public?interface?LoginView?{
//login是个耗时操作,加载中(一般用ProgressBar)
void?showProgress();
//加载完成
void?hideProgress();
//login账号失败给出提示
void?setUserNameError();
//login密码失败给出提示
void?setPasswordError();
//login成功
void?success();
}
MVPLoginActivity
/**
*?功能:需要实现LoginView接口。
*/
public?class?MVPLoginActivity?extends?AppCompatActivity?implements?LoginView?{
LoginPresenterImpl?loginPresenterImpl;
@Override
protected?void?onCreate(@Nullable?Bundle?savedInstanceState)?{
...
//创建一个Presenter对象
loginPresenterImpl?=?new?LoginPresenterImpl(MVPLoginActivity.this);
//第1步:用户点击登录
mvpBinding.mvpLogin.btnLogin.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?v)?{
User?user?=?new?User();
user.setName(mvpBinding.mvpLogin.etAccount.getText().toString());
user.setPassword(mvpBinding.mvpLogin.etPassword.getText().toString());
//第2步:调用Presenter接口中的验证方法
loginPresenterImpl.verifyData(user);
}
});
}
@Override
public?void?showProgress()?{
//加载中
}
@Override
public?void?hideProgress()?{
//加载完成
}
@Override
public?void?setUserNameError()?{
//第7步:通过loginView回传到View层
//账号错误
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
@Override
public?void?setPasswordError()?{
//第7步:通过loginView回传到View层
//密码错误
Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
}
@Override
public?void?success()?{
//第7步:通过loginView回传到View层
Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
//登录成功
}
@Override
protected?void?onDestroy()?{
super.onDestroy();
loginPresenterImpl.onDestroy();
}
}
MVVM实例
1.Model层
实体类bean,继承BaseObservable
public?class?User?extends?BaseObservable{
private?String?name;
private?String?password;
public?User()?{
}
//BR?的域则是通过在?get?方法上加?@Bindable?生成的
@Bindable
public?String?getName()?{
return?name;
}
public?void?setName(String?name)?{
this.name?=?name;
//刷新UI
//BR?的域则是通过在?get?方法上加?@Bindable?生成的
notifyPropertyChanged(BR.name);
}
@Bindable
public?String?getPassword()?{
return?password;
}
public?void?setPassword(String?password)?{
this.password?=?password;
//刷新UI
notifyPropertyChanged(BR.password);
}
public?User(String?name,?String?password)?{
this.name?=?name;
this.password?=?password;
最后
希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!