文档章节

Android MVP 模式 项目初体验(一)

veidy
 veidy
发布于 2015/03/02 14:35
字数 850
阅读 1.5W
收藏 127

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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

 

 

© 著作权归作者所有

veidy

veidy

粉丝 131
博文 47
码字总数 18684
作品 0
深圳
技术主管
私信 提问
加载中

评论(15)

veidy
veidy 博主

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

OnLoginListener的代码呢?
网盘里面有源码
墨羽尘寰
墨羽尘寰
OnLoginListener的代码呢?
郑永博
郑永博
老哥 我想问一下 如果想在这个MVP里面添加RecyclerView和他的item点击事件 应该怎么写比较规范
林泳坛
林泳坛
学习了,
柳絮飘飞
柳絮飘飞
相当不错, 希望大神还能多发表一些技术博客, 我将长期关注你
z
zwvc
MVC中的V本不应该直接发消息给M的。MVP模式中,M和P互相通信,也很奇怪~
爱且不爱
爱且不爱
不错学习了
徐伟涛
徐伟涛
突然发现现在比较流行mvp这个模式啊,就是有点不太习惯,哈哈
iuKa
iuKa
管他MVC MVP,目的只有一个,解耦和
veidy
veidy 博主

引用来自“MiloJiang”的评论

最初在50Android Hacks看过MVP的应用。又仔细了博主的这篇, 感觉目录结构不太合理
额。。。MVP我也接触得不多,有什么不合理的地方还希望大神能指点下,最好有推荐的资料
聊聊Android开发中的MVP模式

一、初识MVP(Model View Presenter) google上关于MVP模式的资料已经特别多了,所以我这里也不啰嗦了。 因为之前做过的几个项目,每个Activity的所有操作代码全部都是堆在里面,虽然查找还算方...

silencezwm
2018/07/03
0
0
MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑...

操张林
2018/05/17
0
0
android悬浮球实现各种功能、快速开发框架、单词、笔记本、应用市场应用等源码

Android精选源码 悬浮球,实现一键静音,一键锁频,一键截屏等功能 一个Android快速开发框架,MVP架构 Android QQ小红点的实现源码 android一款单词应用完整app源码 android新闻简读,图片,...

osc_caanga79
2018/02/05
1
0
《Android构建MVVM》系列(一) 之 MVVM架构快速入门

前言   本文属于《Android构建MVVM》系列开篇,共六个篇章,详见目录树。   该系列文章旨在为Android的开发者入门MVVM架构,掌握其基本开发模式。   辅以讲解Android Architecture Co...

昕无旁骛
2018/08/18
0
0
MVP模式, 开源库mosby的使用及代码分析

Android中的构架模式一直是一个很hot的topic, 近年来Architecture components推出之后, MVVM异军突起, 风头正在逐渐盖过之前的MVP. 其实我觉得MVP还是有好处的, 比如灵活多变(其实只是我用起...

圣骑士wind
2018/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

1M带宽服务器并发数可支撑多少人同时在线?

服务器1M公网带宽能同时承受多少人同时在线?很多云厂商如阿里云、腾讯云推出的很多服务器活动默认配置1M带宽,很多站长认为服务器1M带宽小水管,事实上服务器1M带宽支撑日均2000IP的网站是够...

码笔记
昨天
18
0
C#简单入门——适合初学入门

一、第一个C#程序 using System;namespace HelloWorldApplication // 命名空间声明{ /* 类名为 HelloWorld */ class HelloWorld // 一个 class { /* main函数 ...

ittzg
昨天
9
0
DDD之2领域概念

图中是暗黑领域,非常牛逼的技能。 背景 DDD中出现的名词: 领域,子领域,核心域,通用域,支撑域,限界上下文,聚合,聚合根,实体,值对象 都是关键概念,但是又比较晦涩,在开始DDD之前,...

李福春carter
昨天
12
0
Vue基础学习备忘

内置指令 v-bind v-model v-if/v-else/v-show v-for v-on v-text v-html v-el v-ref v-pre v-cloak v-once 过滤器 作用是对数据再次加工,例如:后台返回时间戳,vue通过过滤器进行数据格式化...

Apache软件基金会主席
昨天
26
0
使用Git版本控制查看文件的更改历史记录 - View the change history of a file using Git versioning

问题: How can I view the change history of an individual file in Git, complete details with what has changed? 如何在Git中查看单个文件的更改历史记录,完整的详细信息? I have got......

技术盛宴
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部