編輯:關於Android編程
MVP模式(Model-View-Presenter)是MVC模式的一個衍生。主要目的是為了解耦,使項目易於維護。
Model 依然是業務邏輯和實體模型 View 經常由Activity實現,包含Presenter的引用。所要做的就是當有交互時,調用Presenter裡的對應方法。 Presenter 負責完成View於Model間的交互,從Model裡取數據,返回給View處理好的數據。在以往的Android開發中,Activity並不是一個標准的MVC模式中的Controller, 它的加載應用的布局和初始化用戶界面,接受並處理來自用戶的操作請求,進而作出響應。但是隨著界面及其邏輯的復雜度不斷提升,Activity類的職責不斷增加,以致變得龐大臃腫。當我們將其中復雜的邏輯處理移至另外的一個類(Presneter)中時,Activity其實就是MVP模式中View,它負責UI元素的初始化,建立UI元素與Presenter的關聯(Listener之類),同時自己也會處理一些簡單的邏輯(復雜的邏輯交由Presenter處理)。
對於測試來說,在MVP模式中,處理復雜邏輯的Presenter是通過interface與View(Activity)進行交互的。我們可以通過自定義類實現這個interface來模擬Activity的行為對Presenter進行單元測試,省去了大量的部署及測試的時間。
MVP模式:
View不直接與Model交互 ,而是通過與Presenter交互來與Model間接交互 Presenter與View的交互是通過接口來進行的,更有利於添加單元測試 通常View與Presenter是一對一的,但復雜的View可能綁定多個Presenter來處理邏輯MVC模式:
View可以與Model直接交互 Controller是基於行為的,並且可以被多個View共享 可以負責決定顯示哪個View一個登陸注冊的例子。
Model為User的信息,項目裡省略了,當然你也可以新建一個User類
public class UserBean {
private String mFirstName ;
private String mLastName ;
public UserBean (String firstName, String lastName) {
this .mFirstName = firstName;
this .mLastName = lastName;
}
public String getFirstName() {
return mFirstName ;
}
public String getLastName() {
return mLastName ;
}
}
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
private ProgressBar progressBar;
private EditText username;
private EditText password;
private LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
progressBar = (ProgressBar) findViewById(R.id.progress);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
findViewById(R.id.button).setOnClickListener(this);
presenter = new LoginPresenterImpl(this);
}
@Override public void onClick(View v) {
presenter.validateCredentials(username.getText().toString(), password.getText().toString());
}
...
...
可以看到LoginActivity implements了兩個接口,LoginView, View.OnClickListener。LoginView是在Presenter中用來與Activity通信的。在onClick()方法中調用了presenter進行事務處理。
LoginView.java
public interface LoginView {
void showProgress();
void hideProgress();
void setUsernameError();
void setPasswordError();
void navigateToHome();
}
public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
private LoginView loginView;
private LoginInteractor loginInteractor;
public LoginPresenterImpl(LoginView loginView) {
this.loginView = loginView;
this.loginInteractor = new LoginInteractorImpl();
}
@Override public void validateCredentials(String username, String password) {
if (loginView != null) {
loginView.showProgress();
}
loginInteractor.login(username, password, this);
}
@Override public void onUsernameError() {
if (loginView != null) {
loginView.setUsernameError();
loginView.hideProgress();
}
}
...
...
可以發現,在onUsernameError()方法中,把處理好的結果通過LoginView接口返還給Activity進行顯示。
到此為止,整個流程就跑通了,M存儲數據,V交互,P處理邏輯。V和P之間通過接口通信。
一.支付寶支付1. 集成說明1.1 作為當下最熱門的支付寶和微信支付,相信有很多的app都很樂意的將支付寶集成在app中,畢竟只要你開發的app有一點涉及到買賣的,都需要
1.git的介紹git是一種項目版本控制工具,公司開發一般多用git,或者svn進行代碼托管,最近,因為項目涉及到多人合作開發,所以趁著有空分享一下經驗,以免各位走彎路。
既然我們能夠實現一個方向的發子彈,那麼根據同樣的道理 也能夠實現八個方向的發子彈。首先在Tank類的KeyPress方法裡面加上按鍵A的事件 // 我方坦克的
一直用的android手機,用過這麼多的app,平時也會遇到有趣的通知提醒,在這裡先總結兩種吧,notification和圖標數字,有的以後看到再研究。還有,推廣一下哈,