优雅地使用Retrofit+RxJava(二)

前言

在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现很多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期,我就写写平时我在使用RxJava+Retrofit怎么去灵活地处理一些场景。比如说一些比较常见的场景:

  • 网络请求过程中token的处理
  • 网络请求数据的加密与解密
  • 为每个请求添加固定的头部,比如说当前版本号,Rsa的密钥等等
  • 规范化每个网络请求,让代码只写一次

我自己平时对代码的简洁性要求非常高,所以retrofit+rxjava正好切中了我的痛点,这也是激发我写这篇文章的原因,我想要与大家一起交流进步,可以看看我的代码示例

一个简单的示例

(可以选择先忽略,等看完这篇文章再回头来看)

/**
* @author whaoming
* github:https://github.com/whaoming
* created at 2017/2/14 15:59
* Description:数据请求的管理类
*/
public class HttpMethods {
   
    //retrofit对应的接口
    private ApiService myService;

    //构造方法私有
    private HttpMethods() {
        List<Interceptor> interceptors = new ArrayList<>();
        Map<String,String> headers = new HashMap<>();
        headers.put("userid",25);
        TokenGetInterceptor tokenGetInterceptor = new TokenGetInterceptor(headers);
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        AESInterceptor aesInterceptor = new AESInterceptor();
         //创建一个http头部处理器拦截器(这里主要处理服务器返回token的捕获)
        interceptors.add(tokenGetInterceptor );
        //日志打印拦截器
        interceptors.add(loggingInterceptor );
        //数据的加密与解密拦截器
        interceptors.add(aesInterceptor);

        RetrofitHelper.getInstance().init(ConstantValue.SERVER_URL,interceptors );
        //创建service
        myService = RetrofitHelper.getInstance().createService(ApiService.class);
    }

    //根据id用户一个用户的信息
    public Observable<UserCommonInfo> getUserInfoById(int userid){
        return  Direct2.create(myService.getUserInfoById(userid),new TokenProviderImpl());
    }
}

/**
 * Created by Mr.W on 2017/2/14.
 * E-maiil:[email protected]
 * github:https://github.com/whaoming
 * TODO: 按照创建者模式的思想,把一个访问服务器的操作规格化
 */
public class Direct {
   
   public static<T> Observable<T> create(Observable<Result<T>> resurce,TokenProvider tokenProvider){
       return resurce
               //解析固定格式json
               .map(new ResultParseInterceptor<T>())
               //处理token过期,tokenProvider为当发现token过期时候具体的处理方式
               .retryWhen(new TokenExpireInterceptor(tokenProvider))
               //捕获整个请求过程中的错误
               .onErrorResumeNext(new ErrorInterceptor<T>())
                .observeOn(AndroidSchedulers.mainThread())
               .subscribeOn(Schedulers.io());
   }
}

网络层:RxJava+Retrofit

相对来说,retrofit+rxjava的学习成本还是比较高的。举个例子,就拿数据打印来说,如果使用okHttp的话,可以直接在回调里面打印服务器返回的json数据,但是放在retrofit中,因为retrofit会自动帮你封装成对应的bean,这使得数据解析这个过程不可见,需要通过retrofit的拦截器才能实现,所以拦截器对于retrofit来说,是一个非常非常重要的东西。

retrofit拦截器的使用场景

日志拦截器

还记得刚开始使用retrofit的时候,就被这个功能吓到了,大哥我只是想简单地打印下服务器给了我什么数据,为什么要这么麻烦啊!!!不过后面也越来越理解retrofit这样做的原因了,(个人愚见)这样使得所有的操作都规范化,用我自己的话说,就是retrofit告诉你,只要你想要”入侵”数据发送和解析的过程,不论是什么操作,你就得给我使用拦截器。那么其实说难也不难,只是几行

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值