Android开发模式——————MVP——————用户登录简单的MVP模式
程序员文章站
2022-05-12 14:58:26
...
MVP VS MVC
废话少说上图
优点
- 降低耦合度,model和View正真分离。修改view不影响Modle
- 模块职责划分明显,层次清晰
- 隐藏数据
- Presenter可以复用,用于多个view而不需改变Presenter的逻辑(当然在view的改动不影响业务逻辑的前提下)
- 易于单元测试
- 代码灵活性
实现功能
我们参照弘扬大神的列子请看效果图
项目结构
涉猎开始
实体类
User类包含用户名,密码两属性,添加set,get方法
IUserBiz
package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;
/**
* Created by yanbo on 2017/5/2.
* 业务逻辑的接口
*/
public interface IUserBiz {
public void login(String username,String pass,OnLoginListener loginListener);
}
OnLoginListener
package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
/**
* Created by yanbo on 2017/5/2.
* 登陆业务逻辑的接口
*/
public interface OnLoginListener {
void loginSuccess(Users users);
void loginFailed();
}
UserBiz
package com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
/**
* Created by yanbo on 2017/5/2.
* 业务逻辑类
*/
public class UserBiz implements IUserBiz {
@Override
public void login(final String username, final String pass, final OnLoginListener loginListener) {
//模拟子线程耗时操作
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//模拟登陆成功
if ("123".equals(username) && "123".equals(pass)){
Users users = new Users(username,pass);
loginListener.loginSuccess(users);
}else {
loginListener.loginFailed();
}
}
}.start();
}
}
UserLoginPresenter
package com.daqsoft.baseproject.mvp.main.act.mvpdesion.presenter;
import android.os.Handler;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.IUserBiz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.OnLoginListener;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.biz.UserBiz;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.view.IUserLoginView;
/**
* Created by yanbo on 2017/5/2.
* 交互桥梁
*/
public class UserLoginPresenter {
//建立v m实例
private IUserBiz mUserBiz;
private IUserLoginView mLoginView;
private Handler mHandler = new Handler();
public UserLoginPresenter(IUserLoginView loginView) {
this.mLoginView = loginView;
this.mUserBiz = new UserBiz();
}
public void login(){
mLoginView.showLoading();
mUserBiz.login(mLoginView.getUsername(), mLoginView.getPassword(), new OnLoginListener() {
@Override
public void loginSuccess(final Users users) {
//需要在UI线程中执行
mHandler.post(new Runnable() {
@Override
public void run() {
mLoginView.toMainActivity(users);
mLoginView.hideLoading();
}
});
}
@Override
public void loginFailed() {
//需要在UI线程中执行
mHandler.post(new Runnable() {
@Override
public void run() {
mLoginView.showFailedError();
mLoginView.hideLoading();
}
});
}
});
}
public void clear(){
mLoginView.clearUserName();
mLoginView.clearPassword();
}
}
IUserLoginView
package com.daqsoft.baseproject.mvp.main.act.mvpdesion.view;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
/**
* Created by yanbo on 2017/5/2.
* view层的视图接口
* 有界面看出有两个按钮 登陆 清除
*
*/
public interface IUserLoginView {
//login说明要有用户名密码
String getUsername();
String getPassword();
//进度条
void showLoading();
void hideLoading();
//成功(跳转)失败提示
void toMainActivity(Users users);
void showFailedError();
//清除
void clearUserName();
void clearPassword();
}
MvpActivity
package com.daqsoft.baseproject.mvp.main.act.mvpdesion;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.daqsoft.baseproject.R;
import com.daqsoft.baseproject.base.BaseActivity;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.bean.Users;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.presenter.UserLoginPresenter;
import com.daqsoft.baseproject.mvp.main.act.mvpdesion.view.IUserLoginView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
//本类介绍mvp开发技巧
public class MvpActivity extends BaseActivity implements IUserLoginView {
@BindView(R.id.activity_mvp_et_username)
EditText mEtUsername;
@BindView(R.id.activity_mvp_et_pass)
EditText mEtPass;
@BindView(R.id.activity_mvp_btn_loggin)
Button mBtnLoggin;
@BindView(R.id.activity_mvp_btn_clear)
Button mBtnClear;
@BindView(R.id.activity_mvp_progressbar)
ProgressBar mProgressbar;
//首先建立交互桥梁
private UserLoginPresenter mPresenter = new UserLoginPresenter(this);
@Override
public int getContentViewResId() {
return R.layout.activity_mvp;
}
@Override
public void init(Bundle savedInstanceState) {
}
@Override
public void initToolBar() {
}
@Override
public void setListener() {
}
@Override
public void initData() {
}
@Override
public void getData() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: add setContentView(...) invocation
ButterKnife.bind(this);
}
@OnClick({R.id.activity_mvp_btn_loggin, R.id.activity_mvp_btn_clear})
public void onClick(View view) {
switch (view.getId()) {
case R.id.activity_mvp_btn_loggin://登陆
mPresenter.login();
break;
case R.id.activity_mvp_btn_clear://清除
mPresenter.clear();
break;
}
}
@Override
public String getUsername() {
return mEtUsername.getText().toString();
}
@Override
public String getPassword() {
return mEtPass.getText().toString();
}
@Override
public void showLoading() {
mProgressbar.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
mProgressbar.setVisibility(View.GONE);
}
@Override
public void toMainActivity(Users users) {
Toast.makeText(this, users.getUsername() +
"恭喜登陆成功", Toast.LENGTH_SHORT).show();
}
@Override
public void showFailedError() {
Toast.makeText(this,
"登陆失败", Toast.LENGTH_SHORT).show();
}
@Override
public void clearUserName() {
mEtUsername.setText("");
}
@Override
public void clearPassword() {
mEtPass.setText("");
}
}
上一篇: RecycleView刷新数据后回到顶部
下一篇: jQuery.width() 函数详解