-
MVP+OKHttp 用户登录demo
关于什么是MVP模式,本文就不再阐述了,下面直接进入正题。
首先我们来看下项目的结构
Model层
对于用户登录, 首先建立IUserLoginModel接口
- public interface IUserLoginModel
- {
- void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack);
- void getUserList(Context context, HttpRequestCallback callback);
- }
UserLoginModel 实现此接口,发送请求登录public interface IUserLoginModel { void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack); void getUserList(Context context, HttpRequestCallback callback); }
- 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 进行回调。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); } }
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中完全不用理会数据是如何获取的,只关心结果。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()); } }); } }
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);
- }
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/yxcoding/MVPDemo
2016
五月
05

3479

被折叠的 条评论
为什么被折叠?



