MVP的实现:登录为例
来源:互联网 发布:java byte二维数组 编辑:程序博客网 时间:2024/06/05 01:51
一.mvp
1.m:model负责数据模型和页面逻辑
数据模型:用户javabean封装的数据
业务逻辑:包括登录的动作,登录的状态,登录的具体执行.
2.view,负责具体页面的展示
页面ui的展示:activity
进度条的展示
页面跳转的展示.
3.p:数据模型和view层的桥梁
通过接口来实现:prestener层对model层的封装,然后view层调用presenter层
二.代码实现
1.model层
数据模型:用户信息
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String username, String password) { this.username = username; this.password = password; } public User() { }}登录动作
/** * Model:登录业务逻辑 * */public interface IUserLoginModel { /** * 登录业务逻辑 * @param username * @param password * @param listener */ void login(String username, String password, OnUserLoginListener listener);}
登录状态
/** * 用户登录回调接口 */public interface OnUserLoginListener { /** * 登录成功 * @param user */ void loginSuccess(User user); /** * 登录失败 */ void loginFailed();}登录具体的执行
/** * Model层,用户登录 */public class UserLoginModel implements IUserLoginModel{ @Override public void login(final String username, final String password, final OnUserLoginListener listener) { //模拟网络耗时操作 new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(1500); //登录业务逻辑 if("heima26".equals(username) && "123456".equals(password)){//登录成功 User user = new User(username, password); listener.loginSuccess(user); }else{//登录失败 listener.loginFailed(); } } }).start(); }}
2.presenter层
/** * Presenter层 * 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量) * 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务 */public class UserLoginPresenter implements OnUserLoginListener { private IUserLoginModel userLoginModel;//model private IUserLoginView userLoginView;//view /** * 两个参数的构造方法对吗? * 如果是两个参数,p层是给View层调用的,说明activity持有model和view的对象,说明view和model连通了,不符合MVP架构 * 所以只能是一个参数构造方法 * @param userLoginModel * @param userLoginView */ /* public UserLoginPresenter(IUserLoginModel userLoginModel, IUserLoginView userLoginView) { this.userLoginModel = userLoginModel; this.userLoginView = userLoginView; }*/ /** * 所以只能是一个参数构造方法 * @param userLoginView */ public UserLoginPresenter(IUserLoginView userLoginView) { this.userLoginModel = new UserLoginModel(); this.userLoginView = userLoginView; } /** * 沟通Model和view层的桥梁方法 */ public void login(){ //1.登录(model),下面一行代码集中体现presenter层起到桥梁作用 userLoginModel.login(userLoginView.getUsername(), userLoginView.getPassword(),this); //2.显示滚动条(View) userLoginView.showProgressbar(); } @Override public void loginSuccess(final User user) { mHandler.post(new Runnable() { @Override public void run() { //1.隐藏滚动条 userLoginView.hideProgressbar(); //2.跳转主页 userLoginView.jump2Main(user); } }); } @Override public void loginFailed() { mHandler.post(new Runnable() { @Override public void run() { //1.隐藏滚动条 userLoginView.hideProgressbar(); //2.提示用户登录失败 userLoginView.showLoginError(); } }); } private Handler mHandler = new Handler();}
3.view层
ui方法的封装共p层调用
/** * View层,如何实现View层,View层是最复杂的一层 * 1.有什么操作:获取用户名、获取密码 * 2.有什么用户交互:显示滚动条、隐藏滚动条 * 3.有什么结果:登录成功跳转主页、登录失败提示用户 */public interface IUserLoginView { /**获取用户名*/ String getUsername(); /**获取密码*/ String getPassword(); /**显示滚动条*/ void showProgressbar(); /**隐藏滚动条*/ void hideProgressbar(); /**登录成功跳转主页*/ void jump2Main(User user); /**登录失败提示用户*/ void showLoginError();}
view具体
public class LoginActivityMVP extends Activity implements OnClickListener,IUserLoginView{ private EditText etUsername; private EditText etPassword; private ProgressBar progressBar; private Context context; private Button btnLogin; private UserLoginPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login_activity_mvp); context = this; initViews(); btnLogin.setOnClickListener(this); } private void initViews() { etUsername = (EditText) findViewById(R.id.et_username); etPassword = (EditText) findViewById(R.id.et_password); progressBar = (ProgressBar) findViewById(R.id.progressBar1); btnLogin = (Button) findViewById(R.id.btnLogin); presenter = new UserLoginPresenter(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnLogin: presenter.login(); break; } } @Override public String getUsername() { return etUsername.getText().toString().trim(); } @Override public String getPassword() { return etPassword.getText().toString().trim(); } @Override public void showProgressbar() { progressBar.setVisibility(View.VISIBLE); } @Override public void hideProgressbar() { progressBar.setVisibility(View.GONE); } @Override public void jump2Main(User user) { Toast.makeText(LoginActivityMVP.this, "登录成功,跳转主页~~~", Toast.LENGTH_SHORT).show(); } @Override public void showLoginError() { Toast.makeText(LoginActivityMVP.this, "用户名或者密码错误,登录失败~~~", Toast.LENGTH_SHORT).show(); }}
0 0
- MVP的实现:登录为例
- MVP简单的实现登录
- 简单的用MVP实现登录界面
- mvp的基本登录(简单实现)
- android mvp实现登录
- MVP 实现登录注册
- MVP简单登录实现
- Mvp实现登录注册
- MVP实现登录注册
- MVP的简单登录
- MVP的简单登录
- MVP模式实现登录功能
- MVP模式实现登录功能
- MVP实现登录注册功能
- 简单实现mvp模式登录
- MVP模式的简单介绍跟简单实现登录功能
- 使用MVP模式实现简单的登录功能
- 一个登录的MVP例子
- JAVA文件树遍历
- POJ 1679 The Unique MST
- angularjs->directive(指令)
- C++基础1
- 软件测试学习之mantis应用
- MVP的实现:登录为例
- Android原生嵌入React Native 过程中遇见的各种坑
- JDBC链接MySQL数据库基本操作方法之一
- Javascript-立即调用函数表达式
- Qt 之 QQ系统表情(三)
- Qt入门-layout布局
- 指南第一章 例题18 UVA 11078 Open Credit System(扫描,维护最大值)
- MySQL Optimization Part 6 - Data BackUps
- 配置VirtualBox共享文件夹遇到unknown filesystem type 'vboxsf'的解决方法