天天看點

淺談MVP實戰及圖解、各種變種詳細記錄

學習的目标是什麼?思想是什麼?下面就跟我一起看看吧。

一、view層即就是activity層要做什麼?

1、findViewById、擷取控件資料getText().toString()、綁定事件,控件顯示隐藏、展示進度條、彈出對話框和Toast、以及給控件設定資料和設定顔色變化,界面跳轉等。這些都是必須要在activity中做的,沒法抽離。

二、Presenter層要幹什麼?怎樣完成的?

1、負責調用view層實作的方法、調用model層處理業務的方法或者調用自身處理業務的方法、使得view層和model層能夠交換資料。主要通過維護的ViewInterface的實作activity對象調用實作的方法、調用model層的方法。另外還可以通過入口方法接收activity中的參數,但這樣修改起來沒有接口獲得參數靈活。

三、model層要做什麼?能做什麼?

1、封裝基本資料、封裝業務處理邏輯、封裝網絡請求邏輯、封裝資料轉換邏輯。

這樣做的好處是什麼?為什麼要這樣做?

原因很簡單:低耦合高内聚,特别适合多個app同一套登入業務之類的

參數如何傳給model層?

1、presenter的構造方法

2、presenter中定義的入口方法

3、利用activity實作的接口,注意activity就是context對象,必須每次都更新view層對象否則activity切換會導緻View層對象回調會出現問題。

下面詳細看每一種的圖解和簡單Demo吧!

第一種:特點完全通過接口擷取所有資料和設定所有資料

淺談MVP實戰及圖解、各種變種詳細記錄

代碼實作:

接口定義:

public interface LoginViewInterface {

    //擷取賬号

    String getUserName();

    //擷取密碼
   String getPassword();

   //消息通知
  void notifyMessage(String message);

 //改變顯示的樣式
 void changeUI();

//展示進度條
    void showProgress();
    //取消進度條
    void dismissProgress(); 

    //跳轉至首頁的方法
    void goActivity();

    void onSuccess(ResponseObject resInfo) throws Exception;
}

Persenter定義:

public class LoginPresenter {

    public LoginModel loginModel;

    public LoginViewInterface loginViewInterface;

    public BaseViewInterface baseViewInterface;

 

    public static LoginPresenter presenter;

 

    public static LoginPresenter getInstance(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {

      
            //每次最好更新loginViewInterface防止activity關閉,持有的對象位址出現問題
            presenter = new LoginPresenter(loginViewInterface, baseViewInterface);
    

        return presenter;

    }
    private LoginPresenter(LoginViewInterface loginViewInterface, BaseViewInterface baseViewInterface) {

        this.loginViewInterface = loginViewInterface;

        this.baseViewInterface = baseViewInterface;

        loginModel = new LoginModel();//處理邏輯的model

    }

    //這是Presenter入口掉用

    public void userLogin("這裡可以為presenter傳參數,然後傳給model層,而不使用接口") {

        String isSuccess = loginModel.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword());

        if(isSuccess){

              loginViewInterface.goActiviy();}}}
 activity定義

public class Login2Activity extends BaseActivity implements LoginViewInterface

activity中調用:

//這是調用,因為這裡用到了BaseActivity所有多傳了個參數

LoginPresenter.getInstance(Login2Activity.this,Login2Activity.this).userLogin()
           

第二種:不同的是很多參數通過Presenter構造方法傳參,不太靈活,詳細就不寫代碼了主要修改的是構造方法,需要重載多個構造方法。

淺談MVP實戰及圖解、各種變種詳細記錄

第三種:通過改造Presenter和Model,來達到目的,即就是讓Model實作ModelInterface接口,然後在Presenter中讓接口指向具體model。

淺談MVP實戰及圖解、各種變種詳細記錄

代碼實作:

model需要實作ModelInterface
public class LoginModel implements LoginModelInterface 

Presenter中構造方法:
loginModelInterface = new LoginModel();
           

第四種:

淺談MVP實戰及圖解、各種變種詳細記錄

第五種:這種不同的是吧控制的一部分通過Presenter回調,分到model中,需要在Presenter中增加内部接口,需要在model中業務處理的方法中添加Presenter回調接口這種相對比較繁瑣,Presenter僅僅作為橋梁的作用不做任何處理和邏輯。

淺談MVP實戰及圖解、各種變種詳細記錄

代碼實作:

這是Presenter中定義的回調接口
public interface CallBack {
        void onSuccess(String message);

        void onFailed(String error);

        void changeUI();

        void setConnectNetwork();

        void goActvity();

        void showProgress();

        void dismissProgress();

        void getResult(String result);
    }

接下來不同的是model:

public void userLogin(String userName, String password, LoginPresenter.CallBack callBack)
//這樣就可以通過callBack回調Presenter接口中的方法了

Presenter入口方法中調用:

public void userLogin() {
        loginModelInterface.userLogin(loginViewInterface.getUserName(), loginViewInterface.getPassword(), new CallBack() {
            @Override
            public void onSuccess(String message) {
                try {
                    loginViewInterface.onSuccess(resInfo);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailed(String error) {
                loginViewInterface.notifyMessage(error);
            }

            @Override
            public void changeUI() {
                loginViewInterface.changeUI();
            }

            @Override
            public void setConnectNetwork() {
                baseViewInterface.setNetConnection();
            }

            @Override
            public void goActvity() {
                loginViewInterface.goActivity();
            }

            @Override
            public void showProgress() {
                loginViewInterface.showProgress();
            }

            @Override
            public void dismissProgress() {
                loginViewInterface.dismissProgress();

            }

            @Override
            public void getResult(String result) {
                try {
                    resInfo = baseViewInterface.getResult(result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
           

第六種:将所有業務處理都放在Presenter中,比如網絡請求,具體業務處理,這樣業務的重用度比較低。

淺談MVP實戰及圖解、各種變種詳細記錄

相對的還有很多改變,根據業務的複雜度,業務的可劃分度自行劃分和分層調用即可。