版權聲明:本文出自veidy的博客,轉載必須註明出處 面試
轉載請註明出處:http://my.oschina.net/aibenben/blog/381274 json
以前你們聽得最多的是MVC,去年去中興面試的時候被問到MVP,當時腦子裏面第一個想到是NBA 詹姆士,哈哈哈。那是第一次聽到MVP模式,後面也沒注意,再後面又聽到別人提起,因而百度瞭解了一下。 服務器
什麼是MVP? 網絡
爲何要用MVP? 框架
怎麼在Android上實現MVP? ide
我再這裏給你們推薦一篇博客:ym——Android開發MVP模式(解決了View和Model的耦合) post
很少說了,我寫了一個登陸的Demo,直接拿來分析MVP在項目中的使用吧。 ui
你們先看看目錄結構 this
先看M層 url
model裏面我寫了一個接口LoginModel,一個實現類LoginModelImple而後還有一個接口OnLoginListener
先看LoginModel
再看LoginModelImple
接着咱們看V層
View裏面我寫了一個接口LoginView
而後,在登陸這個Activity 去實現這個接口,並實現其抽象方法。即看LoginActivity
最後咱們看P層。
這是很重要的一個環節
咱們不是要登陸嗎?因此咱們在LoginPresenter裏面寫一個方法login(),而後咱們在ActiviLoginActivity點擊登陸按鈕後調這個方法。
好亂。。。咱們回到LoginActivity. 在這個activity裏面咱們不涉及邏輯數據處理,咱們就用一個東西LoginPresenter.
這是一個類,直接new,而後調裏面的方法就能達到這個目的了。
。。。。。。。。。。。。。好亂。咱們反過來看吧。
點擊登陸按鈕, 咱們調login()方法,
public void login() {
String name = loginView.getName();
String password = loginView.getPassword();
loginModel.login(name, password, this);
}
登陸須要傳遞的參數咱們經過liginView裏面封裝的方法來獲取(這裏逼格比較高,其實也能夠直接在login()裏面當參數直接傳過來)
獲取到參數後,就須要網絡請求了, loginModel.login(name, password, this);//這個this,就是OnLoginListener
//我這裏網絡請求用的是一個網絡框架,返回請求成功會在onSuccess裏面回調,
@Override
public void login(String name, String password, final OnLoginListener onLoginListener) {
String url = "";
RequestParams requestParams = new RequestParams();
requestParams.put("name", name);
requestParams.put("password", password);
//網絡請求
HttpUtil.post(url, requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//登陸成功
String json = new String(responseBody);
try {
JSONObject jsonObject = new JSONObject(json);
int code = 0;
code = jsonObject.getJSONObject("data").getInt("code");
//code=0 表示登陸成功,code=1表示用戶名錯誤,code=2表示密碼錯誤
if (code == 0) {
onLoginListener.onSuccess();
} else if (code == 1) {
onLoginListener.onUsernameError();
} else if (code == 2) {
onLoginListener.onPasswordError();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
onLoginListener.onFailure();
}
});
}
/////////////////////////////////////////////////////////////////
if (code == 0) {
onLoginListener.onSuccess();
} else if (code == 1) {
onLoginListener.onUsernameError();
} else if (code == 2) {
onLoginListener.onPasswordError();
}
咱們看這裏,若是網絡請求成功,好比說服務器約定登陸成功返回code==0,那你就直接 onLoginListener.onSuccess();
而後,在LoginPresenter 裏面監聽器就監聽到了
並又經過view調moveToIndex()方法
即
若是說返回code==1,用戶名錯誤,咱們須要提示給用戶,先要調
onLoginListener.onUsernameError();
通知LoginPresenter,
而後在這個裏面用view去更新界面 loginView.showToast("用戶名錯誤");
寫好後,一步一步往回看是否是會要清晰呢?
剛上手以爲有點繞,尤爲是接口的設計把握不許,沒事,多弄幾回就熟悉了。
最後源碼供上MVPDemo(連接: http://pan.baidu.com/s/1bnrTHWr 密碼: cebm)