美文网首页网络Android知识Android开发
OkHttp源码分析:感受拦截器设计的艺术

OkHttp源码分析:感受拦截器设计的艺术

作者: linheimx | 来源:发表于2017-03-23 16:46 被阅读235次
    老坛酸菜方便面镇楼

    前言

    OkHttp简单易用,它又非常的流行。我们为什么不扒开她的外衣,看看她美妙的身材呢(小邪恶,嘿嘿)?看看人家的编码艺术,从而提高自己的技术水平。

    在okhttp中拦截器(interceptor)扮演者重要的角色,我们今天就来happy的分析它。

    数据的加工艺术

    先举个小例子:方便面
    我们经常吃方便面,可是你知道方便面是如何生产出来的吗?

    多道工序

    由上图知:我们吃的方便面,由面粉经过一道道工序最终加工成了油炸方便面。

    数据的加工
    类比方便面的加工流程,在我们的编程中,我们时常会遇到这种情况:

    在网络数据交换中,我们经常这样做:发送数据给服务器,接收服务器返回的数据。但是需要注意的是,我们发送和接收的数据也是经过多道工序加工过的。

    1. 发送的数据:原始数据-->添加头部信息-->打印数据的日志信息-->数据加密-->等等
    2. 接收的数据:原始数据-->数据解密-->数据流的观察(下载进度条)-->打印数据相关的日志-->等等

    在okhttp中:
    Request这个类封装了你的请求数据
    Response这个类封装了服务器返回的数据

    一般,我们先构造一个原始的Request,交给Call去发送这个请求,
    这个请求经过多次加工,被送往服务器。然后服务器返回数据,返回的数据被层层加工,最终回到了我们的手里Response
    以上说的流程用下图来简单的表示:

    数据加工处理

    针对这个数据加工流程,okhttp是如何编码设计的呢?

    拦截器 Interceptor

    在一个拦截器中,你可以自由的加工Request和Response。

    如下图:


    拦截器

    由上图可以看出每个拦截器是互相独立的,但是他们是如何链接到一起呢?
    关于链接,okhttp就抽象了Chain这个接口。

    链条 Chain

    okhttp用链条chain来链接拦截器
    如下图:

    一条长链子

    上面每个小圆圈代表一个chain,每个小圆圈环环相扣,形成一条长链子。

    代码在这里

    拦截器 和 链子的定义如下:


    我们看一个链子的具体实现:


    链子的核心:proceed


    核心:Response proceed(Request request)

    代码说明:

    1. 当前链子在proceed方法中,主动构造了下一个链子(将request流出)。
    2. 下一个链子被传入到下一个拦截器中,拦截器处理完毕(将response流入)。


      chain连环相扣

    我们看一个拦截器的实现:日志拦截器


    拦截器的核心



    相关文章

      网友评论

      • c60872c4f65a:写得很好, 深入浅出
        如果有个简单的demo就完美了.
      • 我在等你回复可你没回:拦截器传入response, 处理后将新的response 传给下一个拦截器,可以这样理解吗
        linheimx:每个拦截器对应着一个链子。
        为了让拦截器联通起来:
        每个链子的在处理(proceed)的时候,会主动产生下一个链子,去处理下面一个拦截器。
        linheimx:一个链子的职责:
        将request交给了拦截器,
        拦截器处理好了,产生一个response,返回给了这个链子。
        linheimx:最简单的这么理解:
        拦截器(interceptor)处理request和response
        链子(chain)负责数据(request和response)的流通

      本文标题:OkHttp源码分析:感受拦截器设计的艺术

      本文链接:https://www.haomeiwen.com/subject/hgltottx.html