Android MVP 設計模式*


為什么需要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生命周期處理起來會簡單一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM