android mvp 开源项目,Android MVP 模式 项目初体验(一)

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

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

什么是MVP?

为什么要用MVP?

怎么在Android上实现MVP?

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

大家先看看目录结构

b19aa4deae7243b4be258c0db586ea07.png

先看M层

model里面我写了一个接口LoginModel,一个实现类LoginModelImple然后还有一个接口OnLoginListener

先看LoginModel

dde951af2b66cf093fd2fd2b039a54d1.png

再看LoginModelImple

8ab475127291379f662581492b0e57d9.png

接着我们看V层

View里面我写了一个接口LoginView

c6fe6011b508b046fd543c7f87510730.png

然后,在登录这个Activity 去实现这个接口,并实现其抽象方法。即看LoginActivity

a6cf236e4525430963428e6655142b07.png

最后我们看P层。

这是很重要的一个环节

575b0f58c2d2e6f4fc4109ee61f766ed.png

我们不是要登录吗?所以我们在LoginPresenter里面写一个方法login(),然后我们在ActiviLoginActivity点击登录按钮后调这个方法。

好乱。。。我们回到LoginActivity. 在这个activity里面我们不涉及逻辑数据处理,我们就用一个东西LoginPresenter.

这是一个类,直接new,然后调里面的方法就能达到这个目的了。

fb689a2adc3baf377ff0121d1bcefc2b.png

。。。。。。。。。。。。。好乱。我们反过来看吧。

点击登录按钮, 我们调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 里面监听器就监听到了

f9885c0597065b1fc6aa0091090c092e.png

并又通过view调moveToIndex()方法

52501085d507a1d5a6dfe6281d4a558d.png

如果说返回code==1,用户名错误,我们需要提示给用户,先要调

onLoginListener.onUsernameError();

通知LoginPresenter,

e902f4404a704365346bd85d41c3f51b.png

然后在这个里面用view去更新界面  loginView.showToast("用户名错误");

60790b4cfa11611a372104d690f7c93b.png

写好后,一步一步往回看是不是会要清晰呢?

刚上手觉得有点绕,尤其是接口的设计把握不准,没事,多弄几次就熟悉了。

最后源码供上MVPDemo(链接: http://pan.baidu.com/s/1bnrTHWr 密码: cebm)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值