1.什么是MVP,這里就不做過多解釋,一張圖教你做人含末!
2.直接說重點(diǎn),不逼逼即舌。
例如實(shí)現(xiàn)一個(gè)老生常談的登錄功能:
Model層
登陸的操作的接口
public interface LoginModel {
void login(String username, String password, OnLoginFinishedListener listener);
}
=======================================================
實(shí)現(xiàn)類LoginModelImpl
名字或者密碼為空則登陸失敗佣盒,否則登陸成功
public class LoginModelImpl implements LoginModel {
@Override
public void login(final String username, final String password, final OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
boolean error = false;
if (TextUtils.isEmpty(username)){
listener.onUsernameError();//model層里面回調(diào)listener
error = true;
}
if (TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
}
if (!error){
listener.onSuccess();
}
}
}, 2000);
}
}
==================================================
登陸事件監(jiān)聽
public interface OnLoginFinishedListener {
void onUsernameError();
void onPasswordError();
void onSuccess();
}
Presenter層
登陸的Presenter 的接口,實(shí)現(xiàn)類為L(zhǎng)oginPresenterImpl顽聂,完成登陸的驗(yàn)證肥惭,以及銷毀當(dāng)前view
public interface LoginPresenter {
void validateCredentials(String username, String password);
void onDestroy();
}
======================================================
1 完成presenter的實(shí)現(xiàn)盯仪。這里面主要是Model層和View層的交互和操作。
2 presenter里面還有個(gè)OnLoginFinishedListener蜜葱,
其在Presenter層實(shí)現(xiàn)全景,給Model層回調(diào),更改View層的狀態(tài)牵囤,
確保 Model層不直接操作View層爸黄。如果沒有這一接口在
LoginPresenterImpl實(shí)現(xiàn)的話,LoginPresenterImpl只 有View和Model的引
用那么Model怎么把結(jié)果告訴View呢揭鳞?
public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
private LoginView loginView;
private LoginModel loginModel;
public LoginPresenterImpl(LoginView loginView) {
this.loginView = loginView;
this.loginModel = new LoginModelImpl();
}
@Override
public void validateCredentials(String username, String password) {
if (loginView != null) {
loginView.showProgress();
}
loginModel.login(username, password, this);
}
@Override
public void onDestroy() {
loginView = null;
}
@Override
public void onUsernameError() {
if (loginView != null) {
loginView.setUsernameError();
loginView.hideProgress();
}
}
@Override
public void onPasswordError() {
if (loginView != null) {
loginView.setPasswordError();
loginView.hideProgress();
}
}
@Override
public void onSuccess() {
if (loginView != null) {
loginView.navigateToHome();
}
}
}
View層
登陸View的接口炕贵,實(shí)現(xiàn)類也就是登陸的activity
public interface LoginView {
void showProgress();
void hideProgress();
void setUsernameError();
void setPasswordError();
void navigateToHome();
}
=======================================================
MVP模式中View層對(duì)應(yīng)一個(gè)activity,這里是登陸的activity
的代碼流程:Activity做了一些UI初始化的東西并需要實(shí)例化對(duì)應(yīng)
LoginPresenter的引用和實(shí)現(xiàn) LoginView的接口野崇,監(jiān)聽界面動(dòng)作称开,
Go按鈕按下后即接收到查詢天氣的事件,在onClick里接收到即通過LoginPresenter
的引用把它交給LoginPresenter處理乓梨。LoginPresenter接收到了登陸的邏輯就知道要登陸了鳖轰,
然后LoginPresenter顯示進(jìn)度條并且把邏輯交給我們的Model去處理,也就是這里面的LoginModel扶镀,
(LoginModel的實(shí)現(xiàn)類LoginModelImpl)脆霎,同時(shí)會(huì)把OnLoginFinishedListener也就是LoginPresenter
自身傳遞給我們的Model(LoginModel)。LoginModel處理完邏輯之后狈惫,結(jié)果通過
OnLoginFinishedListener回調(diào)通知LoginPresenter睛蛛,LoginPresenter再把結(jié)果返回給view層的Activity,
最后activity顯示結(jié)果
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
private ProgressBar progressBar;
private EditText username;
private EditText password;
private LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
progressBar = (ProgressBar) findViewById(R.id.progress);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
findViewById(R.id.button).setOnClickListener(this);
presenter = new LoginPresenterImpl(this);
}
@Override
protected void onDestroy() {
presenter.onDestroy();
super.onDestroy();
}
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
progressBar.setVisibility(View.GONE);
}
@Override
public void setUsernameError() {
username.setError(getString(R.string.username_error));
}
@Override
public void setPasswordError() {
password.setError(getString(R.string.password_error));
}
@Override
public void navigateToHome() {
// TODO startActivity(new Intent(this, MainActivity.class));
Toast.makeText(this,"login success",Toast.LENGTH_SHORT).show();
// finish();
}
@Override
public void onClick(View v) {
presenter.validateCredentials(username.getText().toString(), password.getText().toString());
}
}
什么胧谈?寫雞兒忆肾,啥也沒看懂?(滑稽)菱肖,單純的學(xué)習(xí)筆記客冈,看不懂就對(duì)了!
3.那為什么要用用MMP呢稳强?不對(duì)场仲,是MVP MVP MVP!M艘摺渠缕!,MMP的手誤了褒繁。
1.層次分明亦鳞,各層級(jí)之間都不管對(duì)方如何實(shí)現(xiàn),只關(guān)注結(jié)果;
2.在視圖層(Presentation Layer)使用MVP[架構(gòu)] 燕差,使原本臃
的Activity(或Fragment)變得簡(jiǎn)單遭笋,其處理方法都交給了Presenter。
3.易于做[測(cè)試]徒探,只要基于每個(gè)模塊單獨(dú)做好單元測(cè)試就能確保整體的穩(wěn)定性瓦呼。
4.易于快速迭代,基于代碼的低耦合测暗,只需在業(yè)務(wù)邏輯上增加接口央串,
然后在相應(yīng)的層級(jí)分別實(shí)現(xiàn)即可,絲毫不影響其他功能偷溺。
4 參考資料:
要什么參考資料?網(wǎng)站:www.baidu.com 自己搜去吧钱贯,騷年挫掏!