Android---MVP设计模式中级(二)
2015-11-30 18:15
351 查看
上一篇MVP设计模式相对来说比较简单
MVP设计模式初级
这一篇的需求逻辑是如下图片(呵呵,盗图于hyman~~洋洋)
点击打开链接下载本需求demo
这个需求的逻辑是
1、首先在M层,定义一个user类,提供姓名、密码字段
2、在M层中提供一个Login的登录业务方法,在这个方法里面在放置一个接口,这样做的用意是登录成功后,在UserLoginPresenter也就是P层代码中,进行页面更新(这里留一个疑问)
3、在就是V层,V层就是对页面的ui的一些操作了,诸如获取填写的姓名、密码、登录,清空,进度条。。。注意这是一个接口方法
4、最后在主界面实现V层的接口,并实现V层里面的接口方法
5、接下来就进入到P层,P层做啥呢?P层就是负责完成View于Model间的交互,首先在P层中,将MV都放进来,因为我要交互,所以需要他们的对象实例
在就是处理里面的逻辑即可
Model想想还有啥啊??肯定有一个登录的业务东东把,
UserBiz
这里定一个了一个接口回调OnLoginListener
可以看到我们有两个按钮,一个是login,一个是clear;
1、login说明了要有用户名、密码,那么对应两个方法:
2、再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:
3、ogin当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:
IUserLoginView
接下来看P层,就是将mv2层的代码结合起来
UserLoginPresenter
UserLoginActivity
activity_user_login.xml
MVP设计模式初级
这一篇的需求逻辑是如下图片(呵呵,盗图于hyman~~洋洋)
点击打开链接下载本需求demo
这个需求的逻辑是
1、首先在M层,定义一个user类,提供姓名、密码字段
2、在M层中提供一个Login的登录业务方法,在这个方法里面在放置一个接口,这样做的用意是登录成功后,在UserLoginPresenter也就是P层代码中,进行页面更新(这里留一个疑问)
3、在就是V层,V层就是对页面的ui的一些操作了,诸如获取填写的姓名、密码、登录,清空,进度条。。。注意这是一个接口方法
4、最后在主界面实现V层的接口,并实现V层里面的接口方法
5、接下来就进入到P层,P层做啥呢?P层就是负责完成View于Model间的交互,首先在P层中,将MV都放进来,因为我要交互,所以需要他们的对象实例
<span style="font-size:14px;"><strong> private UserBiz userBiz; private IUserLoginView userLoginView;</strong></span>
在就是处理里面的逻辑即可
(一)Model层
Model层首先有一个bean类User对象--提供姓名、密码package com.example.demo; 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; } }
Model想想还有啥啊??肯定有一个登录的业务东东把,
UserBiz
package com.example.demo; public class UserBiz { public void login(final String username, final String password, final OnLoginListener loginListener) { // 模拟子线程耗时操作 new Thread() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // 模拟登录成功 if ("zhy".equals(username) && "123".equals(password)) { User user = new User(); user.setUsername(username); user.setPassword(password); loginListener.loginSuccess(user); } else { loginListener.loginFailed(); } } }.start(); } }
这里定一个了一个接口回调OnLoginListener
package com.example.demo; public interface OnLoginListener { void loginSuccess(User user); void loginFailed(); }
(二) View层
上面我们说过,Presenter与View交互是通过接口。所以我们这里需要定义一个ILoginView,难点就在于应该有哪些方法,我们看一眼效果图:
可以看到我们有两个按钮,一个是login,一个是clear;
1、login说明了要有用户名、密码,那么对应两个方法:
2、再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:
3、ogin当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:
IUserLoginView
package com.example.demo; public interface IUserLoginView { String getUserName(); String getPassword(); void clearUserName(); void clearPassword(); void showLoading(); void hideLoading(); void toMainActivity(User user); void showFailedError(); }
接下来看P层,就是将mv2层的代码结合起来
UserLoginPresenter
package com.example.demo; import android.os.Handler; public class UserLoginPresenter { private UserBiz userBiz; private IUserLoginView userLoginView; private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView) { this.userLoginView = userLoginView; this.userBiz = new UserBiz(); } /** * implements IUserLoginView * 调用接口的回调方法 */ public void login() { userLoginView.showLoading(); userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(), new OnLoginListener() { @Override public void loginSuccess(final User user) { // 需要在UI线程执行 mHandler.post(new Runnable() { @Override public void run() { userLoginView.toMainActivity(user); userLoginView.hideLoading(); } }); } @Override public void loginFailed() { // 需要在UI线程执行 mHandler.post(new Runnable() { @Override public void run() { userLoginView.showFailedError(); userLoginView.hideLoading(); } }); } }); } public void clear() { userLoginView.clearUserName(); userLoginView.clearPassword(); } }
UserLoginActivity
package com.example.demo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; public class UserLoginActivity extends Activity implements IUserLoginView { private EditText mEtUsername, mEtPassword; private Button mBtnLogin, mBtnClear; private ProgressBar mPbLoading; private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter( this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_login); initViews(); } private void initViews() { mEtUsername = (EditText) findViewById(R.id.id_et_username); mEtPassword = (EditText) findViewById(R.id.id_et_password); mBtnClear = (Button) findViewById(R.id.id_btn_clear); mBtnLogin = (Button) findViewById(R.id.id_btn_login); mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading); mBtnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mUserLoginPresenter.login(); } }); mBtnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mUserLoginPresenter.clear(); } }); } /** * implements IUserLoginView * 实现接口回调方法 */ @Override public String getUserName() { return mEtUsername.getText().toString(); } @Override public String getPassword() { return mEtPassword.getText().toString(); } @Override public void clearUserName() { mEtUsername.setText(""); } @Override public void clearPassword() { mEtPassword.setText(""); } @Override public void showLoading() { mPbLoading.setVisibility(View.VISIBLE); } @Override public void hideLoading() { mPbLoading.setVisibility(View.GONE); } @Override public void toMainActivity(User user) { Toast.makeText(this, user.getUsername() + " login success , to MainActivity", Toast.LENGTH_SHORT).show(); } @Override public void showFailedError() { Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show(); } }
activity_user_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.demo.MainActivity" > <EditText android:id="@+id/id_et_username" android:layout_width="match_parent" android:layout_height="wrap_content"> </EditText> <EditText android:id="@+id/id_et_password" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/id_btn_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Login" /> <Button android:id="@+id/id_btn_clear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Clear" /> <ProgressBar android:visibility="gone" android:id="@+id/id_pb_loading" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
相关文章推荐
- Android的Sqlite中DateTime类型数据的存取问题
- android测试之三:monkeyRunner
- Android测试分析3
- android中如何给button加圆角
- androidd时光轴效果实现
- 关于scrollview嵌套listview的方法。但官方并不推荐这种做法。
- android测试之二:monkey测试
- IntelliJ IDEA 13搭建Android集成开发环境
- Android startActivityForResult和setResult
- Android 使用.9图片
- Android ExpandableListView 子item点击事件 注意事项
- Android Jni开发环境搭建完整版
- Android Vibrator 震动
- [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
- android studio 混淆
- 源码分析Android中View的绘制流程
- android NDK的android.mk文件的详解
- Android 坑
- android加固系列—1.如何检验so文件是否加壳成功
- AndroidManifest.xml配置文件详解