安卓MVP模式
阿新 • • 發佈:2019-02-04
一、MVP概念
M : Model(負責儲存、檢索、操縱資料)
V : View(負責繪製UI元素,與使用者進行互動)
P : Presenter (是連線Model 和 View 的橋樑)
二、MVP的作用
- 將檢視邏輯和業務邏輯分離開來,降低耦合度
- Activity只處理生命週期的任務
- 提高程式碼的閱讀性
- Presenter被抽象成介面,有多種具體的實現方式
業務邏輯在Presenter中,避免Activity造成記憶體洩露
三、MVP的核心思想
將Activity中的檢視邏輯抽象成View介面,將業務邏輯抽象成Presenter介面
四、MVP的使用
- 建立BaseView,BasePresenter
- 建立LoginContract(建立View 和 presenter,在其中宣告方法 )
- 建立LoginPresenter(繼承Contract 中的 Presenter,具體實現其中的方法)
- 建立LoginModel(具體實現資料邏輯,如請求網路資料,資料庫中的資料等)
五、Demo程式碼說明
專案架構
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的話,會讓程式碼比較臃腫。