您的位置:首页 > 移动开发 > Android开发

Android MVP 模式 项目初体验(一) - 艾本本的个人页面 - 开源

2015-05-19 17:31 465 查看
    之前大家听得最多的是MVC,去年去中兴面试的时候被问到MVP,当时脑子里面第一个想到是NBA 詹姆士,哈哈哈。那是第一次听到MVP模式,后面也没注意,再后面又听到别人提起,于是百度了解了一下。

     什么是MVP?

     为什么要用MVP?

     怎么在Android上实现MVP?

 

我再这里给大家推荐一篇博客:ym——Android开发MVP模式(解决了View和Model的耦合)   

 

  不多说了,我写了一个登录的Demo,直接拿来分析MVP在项目中的使用吧。

  大家先看看目录结构

 

  先看M层

   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) {

  ,http://hebf.weebly.com/;              //登录成功

                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) {

         ,http://xiank.weebly.com/;               onLoginListener.onSuccess();

                    } else if (code == 1) {

            ,http://shfps.weebly.com/;            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)

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: