MVP概念
- M : Model(負(fù)責(zé)存儲(chǔ)慷暂、檢索、操縱數(shù)據(jù))
- V : View(負(fù)責(zé)繪制UI元素,與用戶進(jìn)行交互)
- P : Presenter (是連接Model 和 View 的橋梁)
MVP的作用
- 將視圖邏輯和業(yè)務(wù)邏輯分離開來,降低耦合
- Activity只處理聲明周期的任務(wù)
- 提高代碼的閱讀性
- Presenter被抽象成接口煤傍,有多種具體的實(shí)現(xiàn)方式
- 業(yè)務(wù)邏輯在Presenter中嘱蛋,避免Activity造成內(nèi)存泄露
MVP的核心思想
- 將Activity中的視圖邏輯抽象成View接口,將業(yè)務(wù)邏輯抽象成Presenter接口
MVP的使用
- 根據(jù)谷歌官方的mvp寫法五续,以下將用一個(gè)用戶登錄的demo來講解洒敏。
- github地址:https://github.com/jwllls/MVPDemo.git
- 步驟如下
- 創(chuàng)建BaseView,BasePresenter
- 創(chuàng)建LoginContract(創(chuàng)建View 和 presenter,在其中聲明方法 )
- 創(chuàng)建LoginPresenter(繼承Contract 中的 Presenter疙驾,具體實(shí)現(xiàn)其中的方法)
- 創(chuàng)建LoginModel(具體實(shí)現(xiàn)數(shù)據(jù)邏輯凶伙,如請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù),數(shù)據(jù)庫中的數(shù)據(jù)等)
Demo代碼說明
項(xiàng)目架構(gòu)
mvp.png
BaseView
public interface BaseView<T> {
void setPresenter(T presenter); //該方法用于綁定View
}
BasePresenter
public interface BasePresenter {
void onStart(); //用來進(jìn)行初始化工作
}
LoginContract
public class LoginContract {
public interface View extends BaseView<Presenter> {
//這里可以定義與 View 相關(guān)的方法
void showLoading(); // 顯示加載
void dismissLoading(); // 隱藏加載
void toastSucMsg(); // 提示登錄成功消息
void toastFailMsg();// 提示登錄失敗
}
public interface Presenter extends BasePresenter {
// 這里可以定義邏輯相關(guān)的方法它碎,如請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)或本地?cái)?shù)據(jù)庫的數(shù)據(jù)等函荣。
void userLogin(String username, String password); // 定義一個(gè)登錄方法显押, 模擬用戶請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行登錄
}
}
LoginModel
public class LoginModel {
//在Model中進(jìn)行具體的數(shù)據(jù)操作,如請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)或請(qǐng)求數(shù)據(jù)庫的數(shù)據(jù)等等傻挂。
/**
* 在這定義一個(gè)獲取用戶對(duì)象的方法
*/
public User getUser() {
//假設(shè)從服務(wù)器上獲取到的對(duì)象是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; //用于數(shù)據(jù)的處理乘碑,如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫請(qǐng)求等
private Activity activity;
public LoginPresenter(LoginContract.View view, Activity activity) {
this.view = view;
this.activity = activity;
view.setPresenter(this); //在構(gòu)造方法中將 Presenter 和 View 綁定
model = new UserModel(); //創(chuàng)建UserModel對(duì)象
}
@Override
public void onStart() {
// userLogin 可以在onStar( )進(jìn)行初始化方法
}
@Override
public void userLogin(String username, String password) {
User user = model.getUserModel(); //模擬獲得網(wǎng)絡(luò)請(qǐng)求返回的用戶數(shù)據(jù)
view.showLoading(); //顯示加載窗
if (user.getUsername().equals(username) && user.getPassword().equals(password)) { //加入賬號(hào)密碼正確則登錄成功
new Handler().postDelayed(new Runnable() { //延遲2秒后執(zhí)行
@Override
public void run() {
view.toastSucMsg(); //登錄成功提示消息
view.dismissLoading(); //關(guān)閉加載窗
activity.startActivity(new Intent(activity, MainActivity.class)); //跳轉(zhuǎn)到主界面
}
}, 2000);
} else {
new Handler().postDelayed(new Runnable() { //延遲1秒后執(zhí)行
@Override
public void run() {
view.toastFailMsg(); //登錄失敗提示消息
view.dismissLoading(); //關(guān)閉加載窗
}
}, 1000);
}
}
}
總結(jié)
以上代碼簡(jiǎn)單地實(shí)現(xiàn)了一個(gè)用戶登陸的mvp模式金拒,這種模式能夠?qū)⑽覀兊拇a充分解耦兽肤,能夠很好地對(duì)代碼進(jìn)行維護(hù)和擴(kuò)展。但是有些時(shí)候我們的需求是一些比較簡(jiǎn)單的業(yè)務(wù)邏輯和界面绪抛,這時(shí)候也可以結(jié)合mvc的方式來加快我們的開發(fā)速度资铡,因?yàn)槿绻總€(gè)界面都要?jiǎng)?chuàng)建Presenter、View等會(huì)讓代碼比較臃腫幢码。