(一)OkHttp网路请求框架详解

前面几篇文章讲解了HTTP相关的技术知识。接下来将看一下OkHttp是如何使用HTTP的相关技术,完成网络请求。如果没有看过之前HTTP的内容,建议先看一下再来看本章的内容。

本文是介绍OkHttp的第一章节----OkHttp的网络请求框架。

一、OkHttp基础

1、OkHttp的发展

早期Android提供两种使用HTTP的工具:java原生的HttpURLConnection和Apache公司的HttpClient。

Sequare公司认为这两种工具都不要用,因此它对这两个工具进行了二次封装,使得使用HTTP的工具更好用,这就是OkHttp的初版。

后来,Sequare公司把HttpClient和HttpURLConnection都剥离出来,完全自己写HTTP的底层实现。这就是我们现在使用的OkHttp的主要部分。

再后来,Sequare公司的方案被Android官方收录,Android4.4开始将原本HttpURLConnection的实现改为用OkHttp实现。OkHttp被公认为是HTTP工具的业界最佳方案。

2、简单示例

看一个OkHttp进行网络请求的简单案例,这里涉及到几个主要的类:OkHttpClient、Request、Call等,后面会进行详细介绍。

二、分发器

分发器就是用来接收所有的HTTP请求,并对这些请求进行良好的管理。使得客户端发起的HTTP请求有条不紊的进行。

2.1 okHttpClient

okHttpClient是框架的大总管,基本所有的请求参数都在这里配置,如url、网络超时时间、是否重定向、代理类型、HTTP协议版本号等都在这里配置。这部分内容后面单独提出来介绍。本文主要介绍网络请求框架,先了解这个类的大概作用。

2.2 RealCall

它是Call接口的具体实现类。通过okHttpClient的newCall方法得到的就是RealCall。

 RealCall继承自Call接口。它的构造函数有三个主要的参数:client、originalRequest和forWebSocket。

client 就是上一节说到的OkHttpClient,这里不再赘述。

Request表示“请求”,它是HTTP请求所需要的所有条件,如请求方法、请求头、请求体等。这里的originalRequest表示“原始请求”,这是最初由用户传进来的请求。事实上OkHttp最终发起的是经过多次封装、改变之后的“请求”。

forWebSocket表示是否是WebSocket协议。WebSocket和HTTP类似,也是一种应用层协议。HTTP1.X版本是不能让服务器主动沟通客户端的,而WebSocket则没有这个限制,使用WebSocket协议,服务器可以主动给客户端发消息。一般的应用场景,像股票交易软件,需要客户端频繁的给客户端刷新数据。如果用HTTP轮询的方式开销太大,十分消耗电量和流量。

HTTP不能双向交互而诞生了WebSocket。OkHttp将WebSocket加入进来,是因为WebSocket连接是通过HTTP的消息建立起来。出于兼容性考虑,OkHttp对WebSocket也做了支持。

正常情况下,这个参数都是false,该知识点了解即可,这里不再做深入的讨论。

2.3 enqueu方法

enqueue()是一个很重的方法。它是将用户发起请求的入口,就是将请求加入OkHttp,并让OkHttp代为发起HTTP请求。下面详细看一下这个方法。

check方法是跟踪程序的错误,以便在出错时进行错误分析。

callStart方法是设置一个回调,作用是对HTTP交互过程进行监听,如请求头开始发送、请求体开始发送、服务器返回请求体开始接收、连接建立、连接关闭等。我们通过OkHttpClient设置网络监听器,监听网络请求中的各种事件,便于对程序进行分析。

client.dispatcher.enqueue是最重要的方法。Dispatcher就是我们说的“分发器”,它的作用是进行线程调度。网络请求是一个高并发的操作,同一时间往往有多个请求发生。这些请求由不同的线程执行。

Dispatcher内部是用ExecutorService实现,它是一种高并发线程池。关于线程池的知识,不了解的,请自行补充一下。

重点看一下Dispatcher的enqueue方法。它是把“请求”添加进readyAsyncCalls队列。这是一个双向队列,存放的是要准备执行,还没执行的请求。 

promoteAndExecute方法是“推选并执行”。它是遍历readyAsyncCalls队列,将符合执行条件的请求“推选”出来,加以执行。

这两判断“符合执行条件”主要有两个维度:不超过当前执行请求的上限和指向同一主机的请求数不超过指定数值。这两个值默认分别是64和5。

符合条件的请求,会通过executeOn调用拦截器,加以执行。简单看一下这个方法,后面详细讲解拦截器的内容。

我们知道这里executeService.execute会执行RealCall里AsyncCall的run方法。所有拦截器的内容都封装在getResponseWithInterceptorChain这一个方法里执行。它的返回值就是执行请求得到的响应内容。

当一个请求执行完,会调用Dispatcher的finished方法,这个方法会再次调用到promoteAndExecute,将符合条件的请求再“推选”出来。如此循环,直到所有的请求执行完。

 以上就是enqueue方法完成HTTP请求的完整过程。

2.4 execute方法

OkHttp提供发起同步请求的方法,就是发起请求后一直等待,直到请求结果返回。

它是通过execute方法实现。可以看到它的实现很简单,直接将请求加入runningSyncCalls对列,调用拦截器,等待请求返回。

 

 到此,我们将OkHttp的主要框架和请求发起流程整理出来。后面我们重点看下OkHttpClient了解OkHttp可以提供哪些内容,以及详细解读拦截器的内容。理解OkHttp进行网络请求的原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值