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 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/yxcoding/MVPDemo







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值