MVP簡介
MVP的出發點是關注點分離,將視圖和業務邏輯解耦。Model-View-Presenter三個部分可以簡單理解爲:
- Model是將在視圖中顯示的數據。
- View是顯示數據(model)的界面,同時將用戶指令(事件)發送給Presenter來處理。View通常含有Presenter的引用。在Android中Activity,Fragment和ViewGroup都扮演視圖的角色。
- Presenter是中間人,同時有兩者的引用。請注意單詞model非常有誤導性。它應該是獲取或處理model的業務邏輯。例如:如果你的數據庫表中存儲着User,而你的視圖想顯示用戶列表,那麼Presenter將有一個數據庫業務邏輯(例如DAO)類的引用,Presenter通過它來查詢用戶列表。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
public void onClick() {
// 賬號和密碼是否符合規範
if (RegexUtils.verifyUsername(mUserName)!=RegexUtils.VERIFY_SUCCESS){
// 賬號不合規範時顯示一個對話框提示
AlertDialogFragment.getInstances(getString(R.string.username_error),getString(R.string.username_rules))
.show(getSupportFragmentManager(),"usernameError");
return;
}
// 密碼不合規範時顯示一個另一個對話框提示
if (RegexUtils.verifyPassword(mPassword)!=RegexUtils.VERIFY_SUCCESS){
AlertDialogFragment.getInstances(getString(R.string.password_error),getString(R.string.password_rules))
.show(getSupportFragmentManager(),"passwordError");
return;
}
// 如果都符合正確註冊規則,進行註冊的業務,我們寫一個異步任務來模擬登錄的網絡請求
@Override
protected void onPreExecute() {
super.onPreExecute();
// 進度條展示
showProgress();
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 拿到數據處理UI
// 隱藏進度、顯示信息、跳轉頁面
hideProgress();
showMessage("註冊成功");
navigateToHome();
}
}.execute();
}
這樣看起來並沒有什麼不對,但是慢慢的你會發現,當本activity裏面的代碼、業務邏輯等多起來,出錯之後就不好找錯誤的地方,並且看起來非常不舒服,所以此時,mvp模式就起到了作用了。
2. Presneter:業務類裏面,去執行業務拿到View需要的數據
3. 拿到數據之後,數據要給視圖View設置上
我們的目的是想要把視圖和業務分離
不建議直接拿視圖的對象來操作,接口:接口回調
在業務過程中視圖的操作:定義一個接口
public interface RegisterView {
void showProgress();// 顯示進度
void hideProgress();// 隱藏進度
void showMessage(String msg);// 顯示信息
void navigateToHome();// 跳轉頁面
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
public void onClick() {
// 賬號和密碼是否符合規範
if (RegexUtils.verifyUsername(mUserName)!=RegexUtils.VERIFY_SUCCESS){
// 賬號不合規範時顯示一個對話框提示
AlertDialogFragment.getInstances(getString(R.string.username_error),getString(R.string.username_rules))
.show(getSupportFragmentManager(),"usernameError");
return;
}
// 密碼不合規範時顯示一個另一個對話框提示
if (RegexUtils.verifyPassword(mPassword)!=RegexUtils.VERIFY_SUCCESS){
AlertDialogFragment.getInstances(getString(R.string.password_error),getString(R.string.password_rules))
.show(getSupportFragmentManager(),"passwordError");
return;
}
// 如果都符合正確註冊規則,進行註冊的業務
public class RegisterPresenter {
private RegisterView mRegisterView;
public RegisterPresenter(RegisterView registerView) {
mRegisterView = registerView;
}
註冊的業務實現
public void register(){
new AsyncTask<Void, Integer, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
// 進度條展示
mRegisterView.showProgress();
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 拿到數據處理UI
// 隱藏進度、顯示信息、跳轉頁面
mRegisterView.hideProgress();
mRegisterView.showMessage("註冊成功");
mRegisterView.navigateToHome();
}
}.execute();
}
}