OKHttp框架源码分析(一)

来源:互联网 发布:天启挂机 源码 编辑:程序博客网 时间:2024/06/10 06:21

1 总体设计

image

上面是OkHttp的总体设计图,主要是通过Dispatcher不断从RequestQueue中取出请求(Call),根据是否已经有缓存调用Cache或者NetWord这两类数据获取接口,从内存缓存或者服务器请求得到数据。OkHttp有两者请求方式,同步请求和异步请求。通过请求时通过Call.execute()直接返回当前的Response,而异步请求会把当前的请求通过call.enqueue添加到请求队列的方式。

接下来会介绍一些比较重要的类,是通过翻译文档所得:

1 Route.java

连接到达一个远程服务器所使用的具体路由。当我们创建一个连接时,客户端有多种选择。
- Http代理
- IP地址
- 配置TLS

Route其实就是对地址的一个封装类。但是很重要。

2 Platform.java

针对不同平台的特定特性。
- 服务器名的识别: 在Android 2.3以上支持
- Session: 在Android 2.3以上支持
- Android 交换状态 : Android 4.0 以上支持
- 应用层协议协商 : 在Android5.0支持

Platform这个类主要做平台适应性,针对Android2.3到5.0后的网络请求的适配支持。同时,这个类中能看到针对不同的平台,通过java反射不同的Class是不一样的。

3 Connection.java

Connection.java是一个接口

public interface Connection {    Route route();    Socket socket();    Handshake handshake();    Protocol protocol();}

Socket和http、https等的连接。与远程主机的连接开通通过代理或者直接连接。RealConnection.java实现了这个接口,应用可以用这个类作为ConnectionPool的属性来对HTTP连接进行管理。

4 ConnectionPool.java

管理HTTP和SPYD的复用以减少网络时延。要求具有相同目的地址的HTTP请求将会共享一个连接。这个类实现决定哪个连接持续保持以便将来使用。

5 Request.java

一个HTTP请求, 这个类的对象是不可变的。

6 Response.java

一个HTTP回复, 这个类的对象是不能改变的。

7 Call.jva

Call是一个已经准备好执行的Request,Call可以被取消。所有的这个类对象代表一个请求/回复对。它不可以执行两次。

8 Dispatcher.java

这个类决定异步请求何时被执行。所有的Dispahtcher在内部使用ExecutorService来执行call。

9 HttpEngine.java

解决单个的HTTP请求/返回对。每个HTTP 按下面的步骤
- 创建HttpEngine
- 通过sendRequest()方法发送请求消息。如果一个reqeust已经被发送了,那么修改request的头部是错误的。
- 通过readResponse来读取response的消息。

当Request的请求方式为get时,response可能为cache、network或者两者的结合。

10 Internal.java

11 Cache.java

HTTP、HTTPS请求的response缓存到本地文件,返回的重用,可以节省时间和带宽。

请求流程图

下面是关于OKHttp的请求流程图
image

0 0
原创粉丝点击