您的位置:首页 > 理论基础 > 计算机网络

MVP+OKHttp 用户登录demo

2016-05-05 17:28 330 查看
关于什么是MVP模式,本文就不再阐述了,下面直接进入正题。

首先我们来看下项目的结构



Model层

对于用户登录, 首先建立IUserLoginModel接口

public interface IUserLoginModel
{
void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack);

void getUserList(Context context, HttpRequestCallback callback);
}
UserLoginModel 实现此接口,发送请求登录

public class UserLoginModel extends BaseModel implements IUserLoginModel
{
@Override
public void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack)
{
RequestParams params = new RequestParams();
params.put("account", account);
params.put("pwd", pwd);
sendPostRequest(context, USER_LOGIN, params, callBack);
}

@Override
public void getUserList(Context context, HttpRequestCallback callback)
{
sendGetRequest(context, GET_USER_LIST, callback);
}
}
通过在BaseModel统一设置Http请求方法,通过HttpRequestCallback 进行回调。

Presenter层

作为model和view的中间件,它要负责的是将在model 中获取的数据展示到view 中。

public class UserLoginPresenter extends BasePresenter
{
private IUserLoginView userLoginView;
private IUserLoginModel userLoginModel;

public UserLoginPresenter(IUserLoginView userLoginView)
{
this.userLoginView = userLoginView;
this.userLoginModel = new UserLoginModel();
}

/**
* 用户开始登录
*
* @param context
* @param account
* @param pwd
*/
public void login(final Context context, String account, String pwd)
{
if (StringUtil.isEmpty(account))
{
userLoginView.showTip("请输入账号");
return;
}

if (StringUtil.isEmpty(pwd))
{
userLoginView.showTip("请输入密码");
return;
}

userLoginModel.userLogin(context, account, pwd, new HttpRequestCallback<Result<User>>()
{

@Override
public void onStart()
{
userLoginView.showLoadingDialog();
}

@Override
public void onFinish()
{
userLoginView.closeLoadingDialog();
}

@Override
public void onResponse(Result<User> user)
{
userLoginView.onLogin(user);
}

@Override
public void onFailure(Call call, HttpException e)
{
userLoginView.showTip(e.getMessage());
}
});
}
}
通过调用userLoginView 中的接口方法,将返回数据展示出来,完全脱离之间关联关系,在View中完全不用理会数据是如何获取的,只关心结果。

View层

这里说的View层,其实是定义了一组接口方法,通过在Activity或者Fragment中实现此接口进行具体的展示工作。

public interface IUserLoginView extends IBaseView
{
/**
* 获取输入账号
*
* @return
*/
String getAccount();

/**
* 获取输入的密码
*
* @return
*/
String getPwd();

/**
* 登录回调
*
* @param result
*/
void onLogin(Result<User> result);

/**
* 获取用户列表(只是个案例)
*
* @param result
*/
void onGetUserList(Result<List<User>> result);
}


这样我们的UserLoginActivity 中就变得很干净了。只有单纯的View层方面的逻辑。

在demo中,使用了OkHttp 作为网络请求的库,在使用中发现, OkHttp功能非常的强大,可以自由灵活的封装成http 请求入口。值得注意的是,OkHttp 的异步请求回调接口Callback 依旧是在子线程中,不能进行一系列的关于UI线程的操作。demo中简单的基于OKHttp 封装了http异步请求的类,可进行参考。

假如不习惯使用OKHttp进行网络请求,本人推荐另一个第三方的网络请求库虽然没有OkHttp强大,但是用起来真特么的爽!!!官方地址http://loopj.com/android-async-http/。对于mvp架构,随便你怎么换网络请求库,都不会影响整体的架构。

项目源码地址 https://github.com/fyxjsj/MVPDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: