Android開發學習--MVP模式入門
阿新 • • 發佈:2017-07-11
handle ges span findview list pass override appcompat over
1、模型與視圖完全分離,我們可以修改視圖而不影響模型
2、可以更高效地使用模型,因為所有的交互都發生在一個地方——Presenter內部
3、我們可以將一個Presenter用於多個視圖,而不需要改變Presenter的邏輯。這個特性非常的有用,因為視圖的變化總是比模型的變化頻繁。
4、如果我們把邏輯放在Presenter中,那麽我們就可以脫離用戶接口來測試這些邏輯(單元測試)
下面示例一個小案例:
項目架構:
首先bean層:
User.java
public class User { private String username;private String password; public String getUsername() { return username; } public String getPassword() { return password; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) {this.password = password; } }
MainActivity.java
public class MainActivity extends AppCompatActivity implements IUserLoginView{ private EditText musername; private EditText mpasssword; private Button mlogin; private Button mclear; private ProgressBar mpb; private UserLoginPresenter mUserLoginPresenter = newUserLoginPresenter(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { musername = (EditText) findViewById(R.id.username); mpasssword = (EditText) findViewById(R.id.password); mlogin = (Button)findViewById(R.id.login); mclear = (Button)findViewById(R.id.clear); mpb = (ProgressBar) findViewById(R.id.pb); mlogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUserLoginPresenter.login(); } }); mclear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUserLoginPresenter.clear(); } }); } @Override public String getUsername() { return musername.getText().toString(); } @Override public String getPassword() { return mpasssword.getText().toString(); } @Override public void clearUsername() { musername.setText(""); } @Override public void clearPassword() { mpasssword.setText(""); } @Override public void showLoading() { mpb.setVisibility(View.VISIBLE); } @Override public void hideLoading() { mpb.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 showFailError() { Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show(); } }
IUserLoginView.java
public interface IUserLoginView { //操作的目的 String getUsername(); String getPassword(); void clearUsername(); void clearPassword(); //友好的交互 void showLoading(); void hideLoading(); //操作的結果,對應的反饋 void toMainActivity(User user); void showFailError(); }
UserLoginPresenter.java
//Model和View的橋梁 login clear public class UserLoginPresenter { private IUserLoginView userLoginView; private IUserBiz userBiz; private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView){ this.userLoginView = userLoginView; this.userBiz = new UserBiz(); } 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 loginfail() { //需要在UI線程執行 mHandler.post(new Runnable() { @Override public void run() { userLoginView.showFailError(); userLoginView.hideLoading(); } }); } }); } public void clear() { userLoginView.clearUsername(); userLoginView.clearPassword(); } }
IUserBiz.java
public interface IUserBiz { public void login(String username,String password,OnLoginListener loginListener); }
UserBiz.java
public class UserBiz implements IUserBiz { @Override 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("name".equals(username)&&"pwd".equals(password)){ User user = new User(); user.setUsername(username); user.setPassword(password); loginListener.loginsuccess(user); }else{ loginListener.loginfail(); } } }.start(); } }
OnLoginListener.java
public interface OnLoginListener { void loginsuccess(User user); void loginfail(); }
Android開發學習--MVP模式入門