Android MVP 模式 项目初体验(一)
博客专区 > veidy 的博客 > 博客详情
Android MVP 模式 项目初体验(一)
veidy 发表于3年前
Android MVP 模式 项目初体验(一)
  • 发表于 3年前
  • 阅读 12070
  • 收藏 127
  • 点赞 12
  • 评论 15

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Android MVP 模式初体验

 版权声明:本文出自veidy的博客,转载必须注明出处 

 转载请注明出处http://my.oschina.net/aibenben/blog/381274

   

之前大家听得最多的是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) {
                //登录成功
                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)

 

 

标签: android mvp 模式 项目
共有 人打赏支持
veidy
粉丝 132
博文 44
码字总数 18176
评论 (15)
amidk
也想写这个的,懒,没写
veidy

引用来自“成为朝拜者”的评论

也想写这个的,懒,没写
过完年没什么事,就想着分享下
IT小香猪
顶一下
每天多一点
最初在50Android Hacks看过MVP的应用。又仔细了博主的这篇, 感觉目录结构不太合理
liuhuajian
veidy

引用来自“MiloJiang”的评论

最初在50Android Hacks看过MVP的应用。又仔细了博主的这篇, 感觉目录结构不太合理
额。。。MVP我也接触得不多,有什么不合理的地方还希望大神能指点下,最好有推荐的资料
iuKa
管他MVC MVP,目的只有一个,解耦和
徐伟涛
突然发现现在比较流行mvp这个模式啊,就是有点不太习惯,哈哈
爱且不爱
不错学习了
zwvc
MVC中的V本不应该直接发消息给M的。MVP模式中,M和P互相通信,也很奇怪~
柳絮飘飞
相当不错, 希望大神还能多发表一些技术博客, 我将长期关注你
林泳坛
学习了,
郑永博
老哥 我想问一下 如果想在这个MVP里面添加RecyclerView和他的item点击事件 应该怎么写比较规范
墨羽尘寰
OnLoginListener的代码呢?
veidy

引用来自“墨羽尘寰”的评论

OnLoginListener的代码呢?
网盘里面有源码
×
veidy
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: