初识mvp
来源:互联网 发布:淘宝交易快照怎么看 编辑:程序博客网 时间:2024/05/17 07:23
刚刚开始看mvp,以下是自己浅显的见识,尽做笔记使用。
MVP 把 Activity 中的 UI 逻辑抽象成 View 接口,把业务逻辑抽象成 Presenter 接口,Model 类还是原来的 Model。Activity 只用来响应生命周期,工作都在prestenter中完成。现以一个登陆模块的例子讲述mvp.
public class LoginActivity extends AppCompatActivity implements View.OnClickListener, ILoginView { private EditText editUser; private EditText editPass; private Button btnLogin; private Button btnClear; ILoginPresenter loginPresenter; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); editUser = (EditText) this.findViewById(R.id.et_login_username); editPass = (EditText) this.findViewById(R.id.et_login_password); btnLogin = (Button) this.findViewById(R.id.btn_login_login); btnClear = (Button) this.findViewById(R.id.btn_login_clear); progressBar = (ProgressBar) this.findViewById(R.id.progress_login); btnLogin.setOnClickListener(this); btnClear.setOnClickListener(this); loginPresenter = new LoginPresenterCompl(this); loginPresenter.setProgressBarVisibility(View.INVISIBLE); } @Override public void onClick(View view) { switch(view.getId()){ case R.id.btn_login_clear: loginPresenter.clear(); break; case R.id.btn_login_login: loginPresenter.setProgressBarVisibility(View.VISIBLE); btnLogin.setEnabled(false); btnClear.setEnabled(false); loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString()); break; default:break; } } @Override public void onClearText() { editUser.setText(""); editPass.setText(""); } @Override public void onLoginResult(Boolean result, int code) { loginPresenter.setProgressBarVisibility(View.INVISIBLE); btnLogin.setEnabled(true); btnClear.setEnabled(true); if (result){ Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show(); } } @Override public void onSetProgressBarVisibility(int visibility) { progressBar.setVisibility(visibility); }}
这是登陆主界面,view只做了视图的操作,初始化参数,视图显示/隐藏操作。所以得业务处理交给了presenter,view层只和presenter交互。
loginPresenter = new LoginPresenterCompl(this);初始化preenter层。
public interface ILoginView { void onClearText(); void onLoginResult(Boolean result,int code); void onSetProgressBarVisibility(int visibility);}
public class LoginPresenterCompl implements ILoginPresenter{ ILoginView iLoginView; IUser user; Handler handler; public LoginPresenterCompl(ILoginView iLoginView){ this.iLoginView=iLoginView; initUser(); handler =new Handler(Looper.getMainLooper()); } private void initUser() { user = new UserModel("mvp","mvp"); } @Override public void clear() { iLoginView.onClearText(); } @Override public void doLogin(String name, String passwd) { Boolean isLoginSuccess = true; final int code =user.checkUserValidity(name,passwd); if(code != 0){ isLoginSuccess = false; } final Boolean result = isLoginSuccess; handler.postDelayed(new Runnable() { @Override public void run() { iLoginView.onLoginResult(result, code); } },3000); } @Override public void setProgressBarVisibility(int visibility) { iLoginView.onSetProgressBarVisibility(visibility); }}
prestenter和view层交互 this.iLoginView=iLoginView;
presnterer和model层交互 user = new UserModel(“mvp”,”mvp”);
但model和view是不直接进行交互的!
prestener层业务逻辑处理完之后调用view层回调,在view层进行页面展现。
唯一有点不爽的事要写那么多借口。。。
public interface ILoginPresenter { void clear(); void doLogin(String name,String passwd); void setProgressBarVisibility(int visibility);}
public interface IUser { String getName(); String getPasswd(); int checkUserValidity(String name, String passwd);}
public class UserModel implements IUser{ String name; String passwd; public UserModel(String name, String passwd) { this.name = name; this.passwd = passwd; } @Override public String getName() { return name; } @Override public String getPasswd() { return passwd; } @Override public int checkUserValidity(String name, String passwd){ if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){ return -1; } return 0; }}
<?xml version="1.0" encoding="utf-8"?><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" android:gravity="center_vertical" tools:context=".MainActivity"> <EditText android:id="@+id/et_login_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="USERNAME"/> <EditText android:id="@+id/et_login_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="PASSWORD"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_login_login" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login" android:layout_weight="1" android:layout_marginRight="4dp"/> <Button android:id="@+id/btn_login_clear" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Clear" android:layout_weight="1" android:layout_marginLeft="4dp"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="correct user: mvp, mvp" android:layout_marginTop="3dp"/> <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:id="@+id/progress_login"/></LinearLayout>
简单说一下mvp的调用,比如显示progress显示
loginPresenter.setProgressBarVisibility(View.VISIBLE);使progress显示,先给presenter处理
LoginPresenterCompl类 @Override public void setProgressBarVisibility(int visibility) { iLoginView.onSetProgressBarVisibility(visibility); }
presente处理完之后给view层回调
LoginActivity类 @Override public void onSetProgressBarVisibility(int visibility) { progressBar.setVisibility(visibility); }
view层显示出来。
再比如登录处理:
//LoginActivity类 loginPresenter.doLogin(editUser.getText().toString(),editPass.getText().toString());
view层给presenter层处理登录逻辑。
//LoginPresenterCompl类 @Override public void doLogin(String name, String passwd) { Boolean isLoginSuccess = true; final int code =user.checkUserValidity(name,passwd); if(code != 0){ isLoginSuccess = false; } final Boolean result = isLoginSuccess; handler.postDelayed(new Runnable() { @Override public void run() { iLoginView.onLoginResult(result, code); } },3000); }
presenter层调用model层的检查输入方法checkUserValidity
//UserModel类@Override public int checkUserValidity(String name, String passwd){ if (name==null||passwd==null||!name.equals(getName())||!passwd.equals(getPasswd())){ return -1; } return 0; }
model层回调返回检测结果给presenter层,presenter层对结果进行处理,又返回view层
iLoginView.onLoginResult(result, code);
//LoginActivity类@Override public void onLoginResult(Boolean result, int code) { loginPresenter.setProgressBarVisibility(View.INVISIBLE); btnLogin.setEnabled(true); btnClear.setEnabled(true); if (result){ Toast.makeText(this,"Login Success",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"Login Fail, code = " + code,Toast.LENGTH_SHORT).show(); } }
view层页面展现。
- MVP初识
- 初识MVP
- 初识MVP
- 初识MVP
- 初识mvp
- android 初识mvp
- MVP模式初识
- 初识Android MVP模式
- 初识MVP架构
- 初识MVP模式
- 摘要MVP概念初识
- 初识Mvp模式
- 初识MVP,简单Demo
- Android 初识 MVC、MVP框架
- 初识MVP以及简单应用
- 初识Android MVP(笔记)
- 一个登录Demo初识MVP
- Android 初识mvp设计模式
- USB上拉下拉问题
- 隐藏入口文件
- mac 设置adb 和 command not found解决方法
- shell 异常退出循环
- InstallShield 2015 Limited Edition 打包程序详解
- 初识mvp
- java设计模式-装饰模式
- 在Java中对Redis的缓存操作
- WPF学习——转换器
- web项目:漏洞修复(1)
- gradle android的task任务配置
- 【FFMPEG】谈谈RTP传输中的负载类型和时间戳
- 第二章 身份验证——《跟我学Shiro》
- 在线工具地址搜集(三)