文档章节

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

veidy
 veidy
发布于 2015/03/02 14:35
字数 850
阅读 12777
收藏 127
点赞 12
评论 15

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

粉丝 130
博文 44
码字总数 18176
作品 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重构之旅:架构篇

EF A舞蹈服 去年10月底来到了新公司,刚开始接手 Android 项目时,发现该项目真的是一团遭,项目开发上没有任何架构可言,开发人员连简单的 MVC、MVP 都不了解,Activity 及其臃肿,业务边界...

codeGoogle ⋅ 05/31 ⋅ 0

Android MVP框架学习实践

五五六六七七八八 作为一名大三在读的学生,想着自己的大学生活只剩下一年了,有了些许紧迫感,于是就打算找一份实习工作来增加自己的项目实战经验。 想着互联网公司都基本都有现成的项目,实...

reggie1996 ⋅ 05/20 ⋅ 0

老生常谈Android的MVP架构

原生框架问题 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开发的时候并没有遇到太多框架上的问题,可是一旦项目规模到了一定的程度,就需要对整个项目的代码结构做一个...

LaxusJ ⋅ 04/23 ⋅ 0

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

课程目标: 基于 MVP 架构使用Android通用开发框架快速开发微博项目实战 适应人群: 适合大学生和初中级android开发工程师,可以系统化的微博类APP的开发,系统化掌握商业化项目的开发。* 不...

13122542396 ⋅ 05/25 ⋅ 0

死磕安卓前序:MVP架构探究之旅—基础篇

前言 了解相关更多技术,可参考《我就死磕安卓了,怎么了?》,接下来谈一谈我们来学习一下MVP的基本认识。 大家对MVC的架构模式再熟悉不过。今天我们就学习一下MVP架构模式。 MVC和MVP之间的...

codeGoogle ⋅ 06/08 ⋅ 0

Android中MVP模式的了解及实例

Android中MVP的由来 在了解MVP之前我相信很多人已经学习过MVC这个框架了!MVP的诞生可以说是建立在MVC在安卓某些不足的方面 MVC简介 .M对应Model,代表业务数据 .V对应View,代表视图 .C对应C...

九尾74 ⋅ 05/26 ⋅ 0

聊聊Android开发中的MVP模式

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

silencezwm ⋅ 2017/11/12 ⋅ 0

android清理缓存动画、天气APP、购物下单选择器、阅读APP、饿了么demo等源码

Android精选源码 android将文本内容局部变颜色代码(http://www.apkbus.com/thread-597560-1-1.html) Android遮罩对比图效果组件(http://www.apkbus.com/thread-597563-1-1.html) 一个能让你了...

逆鳞龙 ⋅ 04/17 ⋅ 0

我的Android重构之旅:框架篇

在我这几年的学习和成长中,慢慢的意识到搭建一个优秀的 Android 开发框架是一件非常困难以及痛苦的事情,它不仅需要满足不断增长的业务需求,还要保证框架自身的整洁与扩展性,这让事情变得...

codeGoogle ⋅ 06/13 ⋅ 0

Android框架搭建(1):界面和数据的分离

采用MVP构架,让activity只做ui的变化,数据的展示,让presenter做数据的处理,数据的传递,让Model做数据的网络获取。 这样就可以将原本全部存在Activity的成百上千行代码分离出来,增加代码...

tmyzh ⋅ 03/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android JNI 读写Bitmap的方法

Java层创建Bitmap,通过JNI将Bitmap传到C/C++进行处理 Java部分 public static native boolean greenBitmap(Bitmap bitmap); C/C++部分 JNIEXPORT jboolean JNICALL Java_com_test_Test_gree......

国仔饼 ⋅ 22分钟前 ⋅ 0

一次性让你懂async/await,解决回调地狱

什么是async? 欢迎留言讨论 async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。相较于 Generator,async 函数的改进在于下面四点: 内置执...

阿K1225 ⋅ 22分钟前 ⋅ 0

angular常用命令

.下载更新操作 1.利用npm下载angular的命令行工具AngularCLI: npm install -g @angular/cli 2.下载jquery: npm install --save jquery 3.更新npm: npm i -g npm 4.更新angular: ng update ......

消散了的诗意 ⋅ 24分钟前 ⋅ 0

window.print 页面打印

定义和用法 print() 方法用于打印当前窗口的内容。 语法 window.print(); window.print() 实际上,是浏览器打印功能菜单的一种程序调用。与点击打印功能菜单一样,不能精确分页,不能设置纸型...

初学者的优化 ⋅ 25分钟前 ⋅ 0

魔兽世界 7.0版本上 PVE装备全攻略

  T套 因为大家应该都会打穿副本的所以具体是哪个boss我就不说了。   T1: 所有套装都在【熔火之心】出   T2: 头原来是在【奥妮克希亚的巢穴】改到黑翼之巢的奈法利安了,腿是在【熔火之...

wangchen1999 ⋅ 25分钟前 ⋅ 0

java.math.BigDecimal使用小结

原文地址 java.math.BigDecimal使用小结 divide方法 使用BigDecimal.divide方法时一定要考虑: 除数是否为0 商是否是无限小数 正确的使用方式 判断除数是否为0,是0做另外的处理逻辑 调用除法...

666B ⋅ 28分钟前 ⋅ 0

关于qstring转char乱码问题。

if (OpenClipboard(NULL)) { HGLOBAL hgClip; EmptyClipboard(); QByteArray byay = FValue.toLocal8Bit(); //转latin编码 char *bochsrc_line = byay.data(); hgClip = GlobalAlloc(GMEM_DD......

backtrackx ⋅ 28分钟前 ⋅ 0

了解SSH加密和连接过程

介绍 SSH或安全shell是安全协议,也是安全管理远程服务器的最常用方式。通过使用多种加密技术,SSH提供了一种机制,用于在双方之间建立加密安全连接,对彼此进行身份验证,以及来回传递命令和...

吴伟祥 ⋅ 35分钟前 ⋅ 0

微信小程序

小程序的全局配置app.json 微信小程序的全局配置保存在app.json文件中。开发者通过使用app.json来配置页面文件(pages)的路径、窗口(window)表现、设定网络超时时间值(networkTimeout)以...

上官清偌 ⋅ 38分钟前 ⋅ 0

【转】百度坐标坐标系之间的转换(JS版代码)

/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换 *///定义一些常量var x_PI = 3.1415926535897932...

HAVENT ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部