基本概念
之前一篇简单介绍了OkHttp
的概况和使用方式,以及如何与Volley
一起使用,知其然也要知其所以然,这一篇大概介绍下这个网络框架的源码结构。基于OkHttp 3.5.0
基本流程
这个框架作为Android开发者应该是很熟悉的。入口的构建是建造者模式,在请求的时候手动构建一个Request
,通过OkHttpClient
的newCall()
方法发起请求,获取Response
,也就是请求最终的结果。代码如下:
1 |
|
主要组件
OkHttpClient.Bulider
- 负责构建
OkHttpClient
,Square官方的建议是全局共用一个OkHttpClient
,实际上OkHttpClient
虽然有public的狗仔方法,内部也是传入一个默认的Builder.
OkHttpClient
- 处理配置这个client的参数,核心方法其实就一个:
1 |
|
Request
- 这个类只用来存储请求的数据,不做实际的事情,具体请求的发起由下一个
RealCall
来做
RealCall
RealCall
实现了Call
接口,关于这个接口的作用,注释已经说清楚了,RealCall
是唯一的实现,也就是OkHttp
实际用来请求的类
A call is a request that has been prepared for execution. A call can be canceled. As this object
represents a single request/response pair (stream), it cannot be executed twice.
- 那么怎么干活呢?
Call
这个接口有两个关键的实现方法,execute()
和enqueue()
,方法名意思已经很明确了,一个同步一个异步,我们只需要看这两个方法的实现就可以了:
1 |
|
同步方法很直接,通过getResponseWithInterceptorChain()
直接取Response
,异步方法则间接一点,包装一个Runnable
扔给线程池,本质上最终使用的也是getResponseWithInterceptorChain()
。然后我们就要看这个方法是何方神圣了:
1 |
|
熟悉OkHttp
的同学都知道OkHttp
有一个很厉害的东西,叫Interceptor
,只要实现了这个接口,就可以在一个请求的Request
和Response
之间做很多文章,比如写个LogInterceptor
打印请求的各种信息,实现也特别优雅,但是看了源码才知道,Interceptor
贯穿了请求的全部,无论是重试机制、缓存还是具体请求,实际上都是通过Interceptor
来做的。那么接下来就分析源码中用到的这些Interceptor
.
RetryAndFollowUpInterceptor
- 负责重试和重定向
BridgeInterceptor
- 负责把请求转换为发送给服务器的请求,把服务器返回的结果包装成我们接收到的
Response
CacheInterceptor
- 缓存命中时则直接返回结果,未命中时则在网络请求结果返回时更新缓存
ConnectInterceptor
- 负责与服务器建立连接
CallServerInterceptor
- 负责向服务器发送请求,从服务器读取返回结果
环环相扣,是一个典型的责任链模式,这些Interceptor
与我们平时写的简单的Interceptor
本质是一样的,都是实现一个intercept(Chain chain)
方法,然后在Request
和Response
上做文章,但是套在一起,就实现了一个完整的网络请求过程,同时还完成了重试、缓存这些工作。具体的代码就不分析了···因为具体发起请求和读取返回结果又是HttpCodec
和Okio
这两个大家伙的工作,分析起来又是大把的时间耗在里面了(都是泪)。有兴趣的同学可以读读看。如果只是分析OkHttp
大的源码结构的话,这几个类就足够了。