為什么需要MVP
關於什么是MVP,以及MVC、MVP、MVVM有什么區別,這類問題網上已經有很多的講解,你可以自行搜索或看看文末的參考文章,這里就只講講為什么需要MVP。
在Android開發中,Activity並不是一個標准的MVC模式中的Controller,它的首要職責是加載應用的布局和初始化用戶界面,並接受並處理來自用戶的操作請求,進而作出響應。但是,隨着界面及其邏輯的復雜度不斷提升,Activity類的職責不斷增加,以致很容易變得龐大而臃腫。
越小的類,bug越不容易出現,越容易調試,更容易測試,我相信這一點大家是都贊同的。在MVP模式下,View和Model是完全分離沒有任何直接關聯的(比如你在View層中完全不需要導Model的包,也不應該去關聯它們)。
使用MVP模式能夠更方便的幫助Activity(或Fragment)職責分離,減小類體積,使項目結構更加清晰。
MVC和MVP到底有什么區別呢?
從這幅圖可以看到,我們可以看到在MVC里,View是可以直接訪問Model的!從而,View里會包含Model信息,不可避免的還要包括一些業務邏輯。
AndroidMVP使用示例
首先需要定義一個View層接口,讓View實現類Activity(Fragment)實現;
其次需要定義一個Presenter實現接口,讓Presenter實現類實現;
在View實現類Activity(Fragment)中包含Presenter對象,並在Presenter創建的時候傳一個View對象;
在Presenter中通過構造時傳入的視圖層對象操作View
從M開始
UserModel.Class
public class UserModel { public ILoginPresenter mILoginPresenter; public UserModel(ILoginPresenter presenter) { this.mILoginPresenter = presenter; } public void getServerLogon(String username, String password){ int state=0; mILoginPresenter.responeLogin(state); } }
接下來是V
ILoginView.Class
public interface ILoginView { void loginSuccess(int state); }
LoginActivity.Class
public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener { private EditText usernameEdit, passwrodEdit; private Button loginButton; private LoginPersenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvplogin); usernameEdit = (EditText) findViewById(R.id.et_username); passwrodEdit = (EditText) findViewById(R.id.et_username); loginButton = (Button) findViewById(R.id.bt_login); loginButton.setOnClickListener(this); loginPresenter = new LoginPersenter(this); } @Override public void loginSuccess(int state) { Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_login: loginPresenter.requestLogin(usernameEdit.getText().toString(), passwrodEdit.getText().toString()); break; } } }
最后就是P了
ILoginPresenter.Class
public interface ILoginPresenter { void responeLogin(int state); }
LoginPresenter.Class
public class LoginPersenter implements ILoginPresenter { public UserModel mUserModel; public ILoginView mILoginView; public LoginPersenter(ILoginView view) { mILoginView=view; mUserModel = new UserModel(this); } public void requestLogin(String username, String password){ mUserModel.getServerLogon(username,password); } @Override public void responeLogin(int state) { mILoginView.loginSuccess(state); } }
Android MVP存在的問題
1.在實際開發當中,由於團隊之間很難做到密切配合,所以view往往是很難服用的。不用強求復用View
2. 例如當應用進入后台且內存不足的時候,系統是會回收這個Activity的。通常我們都知道要用OnSaveInstanceState()
去保存狀態,用OnRestoreInstanceState()
去恢復狀態。 在生命周期處理好Persenter的相關判斷。
3.Persenter不參與Android生命周期處理起來會簡單一些。