之前大家听得最多的是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)

更多相关文章

  1. 学习Android闹钟源代码(三)-AlarmClock类分析(part1)
  2. adb通过wifi连接方法
  3. Android抓包方法(一)之Fiddler代理
  4. Android(安卓)消息机制(Handler Looper Message )理解
  5. Android(安卓)Native程序crash的一些定位方法简介
  6. web网页和ios、android进行交互
  7. Android静默安装
  8. Android动态加载JAR包的实现方法
  9. Android(安卓)webview使用漏洞案例解析

随机推荐

  1. android之Shape和selector等
  2. 从零开始学Xamarin.Forms(三) Android 制
  3. Android初始化OpenGL ES,并且分析Renderer
  4. android 一些少见和小细节BUG
  5. Android动画四种类型xml布局
  6. Android 如何在通话中播放音乐/通话背景
  7. Android(安卓)AlertDialog去掉系统黑色背
  8. ubuntu下cocos2d--Android环境搭建
  9. Android中的双击事件,可扩展至多击事件
  10. android_c++ 高级编程NDK学习笔记一