Android MVP 模式 項目初體驗(一)

 版權聲明:本文出自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)

相關文章
相關標籤/搜索