网络Android知识Android开发

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

2017-03-23  本文已影响235人  linheimx
老坛酸菜方便面镇楼

前言

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连环相扣

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


拦截器的核心



上一篇下一篇

猜你喜欢

热点阅读