MVP

2016 五月
05

MVP+OKHttp 用户登录demo

关于什么是MVP模式,本文就不再阐述了,下面直接进入正题。

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

Model层

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

  1. public interface IUserLoginModel  
  2. {  
  3.     void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack);  
  4.   
  5.     void getUserList(Context context, HttpRequestCallback callback);  
  6. }  
public interface IUserLoginModel
{
    void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack);

    void getUserList(Context context, HttpRequestCallback callback);
}
UserLoginModel 实现此接口,发送请求登录
  1. public class UserLoginModel extends BaseModel implements IUserLoginModel  
  2. {  
  3.     @Override  
  4.     public void userLogin(Context context, String account, String pwd, HttpRequestCallback callBack)  
  5.     {  
  6.         RequestParams params = new RequestParams();  
  7.         params.put(”account”, account);  
  8.         params.put(”pwd”, pwd);  
  9.         sendPostRequest(context, USER_LOGIN, params, callBack);  
  10.     }  
  11.   
  12.     @Override  
  13.     public void getUserList(Context context, HttpRequestCallback callback)  
  14.     {  
  15.         sendGetRequest(context, GET_USER_LIST, callback);  
  16.     }  
  17. }  
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 中。

  1. public class UserLoginPresenter extends BasePresenter  
  2. {  
  3.     private IUserLoginView userLoginView;  
  4.     private IUserLoginModel userLoginModel;  
  5.   
  6.     public UserLoginPresenter(IUserLoginView userLoginView)  
  7.     {  
  8.         this.userLoginView = userLoginView;  
  9.         this.userLoginModel = new UserLoginModel();  
  10.     }  
  11.   
  12.     /** 
  13.      * 用户开始登录 
  14.      * 
  15.      * @param context 
  16.      * @param account 
  17.      * @param pwd 
  18.      */  
  19.     public void login(final Context context, String account, String pwd)  
  20.     {  
  21.         if (StringUtil.isEmpty(account))  
  22.         {  
  23.             userLoginView.showTip(”请输入账号”);  
  24.             return;  
  25.         }  
  26.   
  27.         if (StringUtil.isEmpty(pwd))  
  28.         {  
  29.             userLoginView.showTip(”请输入密码”);  
  30.             return;  
  31.         }  
  32.   
  33.         userLoginModel.userLogin(context, account, pwd, new HttpRequestCallback<Result<User>>()  
  34.         {  
  35.   
  36.   
  37.             @Override  
  38.             public void onStart()  
  39.             {  
  40.                 userLoginView.showLoadingDialog();  
  41.             }  
  42.   
  43.             @Override  
  44.             public void onFinish()  
  45.             {  
  46.                 userLoginView.closeLoadingDialog();  
  47.             }  
  48.   
  49.             @Override  
  50.             public void onResponse(Result<User> user)  
  51.             {  
  52.                 userLoginView.onLogin(user);  
  53.             }  
  54.   
  55.             @Override  
  56.             public void onFailure(Call call, HttpException e)  
  57.             {  
  58.                 userLoginView.showTip(e.getMessage());  
  59.             }  
  60.         });  
  61.     }  
  62. }  
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中实现此接口进行具体的展示工作。

  1. public interface IUserLoginView extends IBaseView  
  2. {  
  3.     /** 
  4.      * 获取输入账号 
  5.      * 
  6.      * @return 
  7.      */  
  8.     String getAccount();  
  9.   
  10.     /** 
  11.      * 获取输入的密码 
  12.      * 
  13.      * @return 
  14.      */  
  15.     String getPwd();  
  16.   
  17.     /** 
  18.      * 登录回调 
  19.      * 
  20.      * @param result 
  21.      */  
  22.     void onLogin(Result<User> result);  
  23.   
  24.     /** 
  25.      * 获取用户列表(只是个案例) 
  26.      * 
  27.      * @param result 
  28.      */  
  29.     void onGetUserList(Result<List<User>> result);  
  30. }  
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







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值