Android 從零搭建簡單MVP Demo


首先簡單介紹一下MVP的構成及優缺點:

MVP的全稱為Model-View-Presenter,

Model提供數據(網絡請求、數據存儲等);

View負責頁面顯示;

Presenter負責邏輯的處理;

優點:主要就是將Model層和View層完全解耦,使得兩者任一方的修改都不會對另一方產生影響,而是將邏輯處理放在了Presenter層;

缺點:顯而易見,隨着項目的增大,Presenter層也會變得臃腫,所以根據不同項目邏輯靈活的去使用Presenter也很重要;

之前有做過基於MVP的Android項目,根據別人寫好的結構,無非就是填充代碼,對於MVP整體的理解不夠到位,所以該如何從頭去理解一個MVP項目,對今后避免一些邏輯錯誤也是至關重要的。

下面我會以簡單的登錄模塊為例,結合具體代碼將整個MVP分步來構建,以便更好的去理解MVP,有需要的可以將完整demo去文末clone下來。

1.定義View層接口

public interface LoginView {
    void showProgress();
    void hideProgress();
    void loginSuccess();
    void loginFail();
}

2.LoginActivity實現View接口,基本頁面布局就不一一展示了,只附上關鍵代碼

LoginActivity ->

  @Override
public void showProgress() { mWaitLogin.setVisibility(View.VISIBLE); } @Override public void hideProgress() { mWaitLogin.setVisibility(View.GONE); } @Override public void loginSuccess() { Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show(); //登錄成功,跳轉到主頁面 } @Override public void loginFail() { Toast.makeText(this, "登錄失敗", Toast.LENGTH_SHORT).show(); //登錄失敗,停留在登錄頁面 }

3.定義Model接口

public interface LoginModel {
    interface OnLoginListener {
        void onLoginSuccess();

        void onLoginFail();
    }

    void login(String username, String password, OnLoginListener listener);
}

4.實現Model接口,模擬登錄請求

public class LoginModelImpl implements LoginModel {
    @Override
    public void login(final String username, final String password, final OnLoginListener listener) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (username.equals("1") && password.equals("1")) {
                    listener.onLoginSuccess();
                } else {
                    listener.onLoginFail();
                }
            }
        }, 3000);
    }
}

5.這時我們需要知道,在LoginActivity中點擊登錄后,需要通過Presenter去控制Model來執行具體登錄操作,所以接下來定義Presenter接口

public interface LoginPresent {
    void doLogin(String username, String password);
}

6.實現Presenter接口及登錄監聽接口並編寫具體的邏輯

public class LoginPresentImpl implements LoginPresent,LoginModel.OnLoginListener{
    private LoginView mView;
    private LoginModel mModel;

    public LoginPresentImpl(LoginView view, LoginModel model) {
        mView = view;
        mModel = model;
    }
    @Override
    public void doLogin(String username,String password) {
        mView.showProgress();
        mModel.login(username, password, this);
    }

    @Override
    public void onLoginSuccess() {
        mView.hideProgress();
        mView.loginSuccess();
    }

    @Override
    public void onLoginFail() {
        mView.hideProgress();
        mView.loginFail();
    }
}

7.在LoginActivity中控制Presenter去進行登錄處理

mPresent = new LoginPresentImpl(this, new LoginModelImpl());

        mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String username = mUserName.getText().toString().trim();
                String password = mPassword.getText().toString().trim();
                //簡單進行非空驗證
                if (username != null && !username.equals("") && password != null && !password.equals("")) {
                    //這里想要執行登錄操作,需要通過Present控制Model請求
                    mPresent.doLogin(username, password);
                } else {
                    Toast.makeText(LoginActivity.this, "用戶名或密碼不能為空", Toast.LENGTH_SHORT).show();
                }

            }
        });

麻雀雖小,五臟俱全,這樣一個完整的MVP模式就一步一步構建出來了。

demo鏈接:https://github.com/wangpeng0531/MyMVP.git


免責聲明!

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



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