Android MVP 学习

MVP -- Model View Presenter

MartinFowler 的 这篇文章 将MVP分为 SupervisingPresenter 和 PassiveView


Android 中MVP 例子: https://github.com/antoniolg/androidmvp

先看一下项目的结构

                    


可以看出每个功能模块包含 XXActivity,XXView (Interface),XXPresenter(interface),XXPresenterImp


LoginView接口,负责逻辑处理

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public interface LoginView {  
  2.     public void showProgress();  
  3.   
  4.     public void hideProgress();  
  5.   
  6.     public void setUsernameError();  
  7.   
  8.     public void setPasswordError();  
  9.   
  10.     public void navigateToHome();  
  11. }  


LoginPresenter接口

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public interface LoginPresenter {  
  2.     public void validateCredentials(String username, String password);  
  3. }  

LoginActivity,实现了LoginView接口,实现了对应的方法,内部包含一个Presenter作为成员变量,presenterImp调用响应的方法进行UI更新与同步

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class LoginActivity extends Activity implements LoginView, View.OnClickListener {  
  2.   
  3.     private ProgressBar progressBar;  
  4.     private EditText username;  
  5.     private EditText password;  
  6.     private LoginPresenter presenter;  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_login);  
  12.   
  13.         progressBar = (ProgressBar) findViewById(R.id.progress);  
  14.         username = (EditText) findViewById(R.id.username);  
  15.         password = (EditText) findViewById(R.id.password);  
  16.         findViewById(R.id.button).setOnClickListener(this);  
  17.   
  18.         presenter = new LoginPresenterImpl(this);  
  19.     }  
  20.   
  21.     @Override public void showProgress() {  
  22.         progressBar.setVisibility(View.VISIBLE);  
  23.     }  
  24.   
  25.     @Override public void hideProgress() {  
  26.         progressBar.setVisibility(View.GONE);  
  27.     }  
  28.   
  29.     @Override public void setUsernameError() {  
  30.         username.setError(getString(R.string.username_error));  
  31.     }  
  32.   
  33.     @Override public void setPasswordError() {  
  34.         password.setError(getString(R.string.password_error));  
  35.     }  
  36.   
  37.     @Override public void navigateToHome() {  
  38.         startActivity(new Intent(this, MainActivity.class));  
  39.         finish();  
  40.     }  
  41.   
  42.     @Override public void onClick(View v) {  
  43.         presenter.validateCredentials(username.getText().toString(), password.getText().toString());  
  44.     }  
  45. }  


LoginPresenterImp,实现了LoginPresenter
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. ublic class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {  
  2.   
  3.     private LoginView loginView;  
  4.     private LoginInteractor loginInteractor;  
  5.   
  6.     public LoginPresenterImpl(LoginView loginView) {  
  7.         this.loginView = loginView;  
  8.         this.loginInteractor = new LoginInteractorImpl();  
  9.     }  
  10.   
  11.     @Override public void validateCredentials(String username, String password) {  
  12.         loginView.showProgress();  
  13.         loginInteractor.login(username, password, this);  
  14.     }  
  15.   
  16.     @Override public void onUsernameError() {  
  17.         loginView.setUsernameError();  
  18.         loginView.hideProgress();  
  19.     }  
  20.   
  21.     @Override public void onPasswordError() {  
  22.         loginView.setPasswordError();  
  23.         loginView.hideProgress();  
  24.     }  
  25.   
  26.     @Override public void onSuccess() {  
  27.         loginView.navigateToHome();  
  28.     }  
  29. }  

整个项目架构中,将逻辑处理和UI同步更新从Activity中分离出来,代码更加简洁

对于MVP还不是太理解,还需要再多看例子啊


关于MVP的改进  :博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值