1. 程式人生 > >安卓MVP模式

安卓MVP模式

一、MVP概念

M : Model(負責儲存、檢索、操縱資料)
V : View(負責繪製UI元素,與使用者進行互動)
P : Presenter (是連線Model 和 View 的橋樑)

二、MVP的作用

  1. 將檢視邏輯和業務邏輯分離開來,降低耦合度
  2. Activity只處理生命週期的任務
  3. 提高程式碼的閱讀性
  4. Presenter被抽象成介面,有多種具體的實現方式
    業務邏輯在Presenter中,避免Activity造成記憶體洩露

三、MVP的核心思想

將Activity中的檢視邏輯抽象成View介面,將業務邏輯抽象成Presenter介面

四、MVP的使用

  1. 建立BaseView,BasePresenter
  2. 建立LoginContract(建立View 和 presenter,在其中宣告方法 )
  3. 建立LoginPresenter(繼承Contract 中的 Presenter,具體實現其中的方法)
  4. 建立LoginModel(具體實現資料邏輯,如請求網路資料,資料庫中的資料等)

五、Demo程式碼說明

專案架構

mvp

BaseView

public interface BaseView<T> {

    void setPresenter(T presenter);  //該方法用於繫結View

}

BasePresenter

public interface
BasePresenter { void onStart(); //用來進行初始化工作 }

LoginContract

public class LoginContract {

    public interface View extends BaseView<Presenter> {
        //這裡可以定義與 View 相關的方法

        void showLoading();  // 顯示載入

        void dismissLoading();  // 隱藏載入

        void toastSucMsg(); // 提示登入成功訊息
void toastFailMsg();// 提示登入失敗 } public interface Presenter extends BasePresenter { // 這裡可以定義邏輯相關的方法,如請求網路資料或本地資料庫的資料等。 void userLogin(String username, String password); // 定義一個登入方法, 模擬使用者請求網路資料進行登入 } }

LoginModel

在Model中進行具體的資料操作,如請求網路資料或請求資料庫的資料等等。

public class LoginModel {
    /**
     * 在這定義一個獲取使用者物件的方法
     */
    public User getUser() {

        //假設從伺服器上獲取到的物件是User,使用者名稱和密碼分別是admin和12345

        User user = new User();

        user.setUsername("admin");
        user.setPassword("12345");

        return user;

    }
}

LoginPresenter

public class LoginPresenter implements LoginContract.Presenter {

    private LoginContract.View view;
    private UserModel model;   //用於資料的處理,如網路請求、資料庫請求等
    private Activity activity;

    public LoginPresenter(LoginContract.View view, Activity activity) {
        this.view = view;
        this.activity = activity;
        view.setPresenter(this);  //在構造方法中將 Presenter 和 View 繫結
        model = new UserModel();  //建立UserModel物件
    }

    @Override
    public void onStart() {
        // userLogin  可以在onStar( )進行初始化方法
    }

    @Override
    public void userLogin(String username, String password) {

        User user = model.getUserModel();   //模擬獲得網路請求返回的使用者資料

        view.showLoading();  //顯示載入窗

        if (user.getUsername().equals(username) && user.getPassword().equals(password)) {  //加入賬號密碼正確則登入成功

            new Handler().postDelayed(new Runnable() {  //延遲2秒後執行
                @Override
                public void run() {
                    view.toastSucMsg();     //登入成功提示訊息
                    view.dismissLoading();  //關閉載入窗
                    activity.startActivity(new Intent(activity, MainActivity.class));  //跳轉到主介面
                }
            }, 2000); 

        } else {

            new Handler().postDelayed(new Runnable() { //延遲1秒後執行
                @Override
                public void run() {
                    view.toastFailMsg();    //登入失敗提示訊息
                    view.dismissLoading(); //關閉載入窗
                }
            }, 1000);

        }
    }
}

六、總結

以上程式碼簡單地實現了一個使用者登陸的mvp模式,這種模式能夠將我們的程式碼充分解耦,能夠很好地對程式碼進行維護和擴充套件。但是有些時候我們的需求是一些比較簡單的業務邏輯和介面,這時候也可以結合mvc的方式來加快我們的開發速度,因為如果每個介面都要建立Presenter、View的話,會讓程式碼比較臃腫。