xUtils框架中的HttpUtils模块实现原理

HttpUtils 中有几个大类,下面一一介绍他们的功能:

1,HTTPRequest。 网络请求的包装类。 包括 url, 访问请求方法, 参数值等。

2,RequestCallBack。完成数据请求回调接口。

3,HttpHandler。获取网络数据逻辑的实现。这里可以理解为系统内部 AsyncTask。处理的流程图:

xUtils框架中的HttpUtils模块实现原理

4,HttpCache。 网络数据的缓存,内部包含 LruMemoryCache。在获取数据的时候会判断是否过期。当加载图片数据时。首先从内存缓存中取,如果没有再从文件缓存中取,如果文件缓存没有取到,就从网络下载图片并且加入内存和文件缓存。
如果缓存区满了的话,则会将上一次使用时间最早的缓存数据删掉。

5,StringDownLoadHandler。handleEntity()将网络 io 流转化为 String。

6,FileDownLoadHandler。 handleEntity()将网络 io 流转化为 File。

7,HttpException。 统一的异常类。

HttpUtils的总体设计框架:

xUtils框架中的HttpUtils模块实现原理

流程图

xUtils框架中的HttpUtils模块实现原理

值得注意的是:所有的数据请求任务都是异步进行的,HttpClient+AsynTask。
异步任务可以避免Http网路连接由于网络延迟等问题请求数据慢导致的用户体验差的问题(加载速度慢导致的UI更新慢)

请求发送前执行设置拦截器,如果没有添加头部信息,加上请求的头部,并将数据进行gzip压缩, 通过gizp压缩后的数据传输效率高很多。从服务器获取到了数据之后,还会进行判断,判断是否需要进行gzip解压。

HttpUtils是采用线程池的方式执行请求的,

执行网络请求执行步骤:
* 1.获取重定向处理对象
* 2.死循环执行,首先判断如果是续传下载文件,根据新建的文件对象大小设置相应下载范围。
* 3.获取缓存文件,如果存在缓存直接返回响应对象
* 4.没有缓存去请求执行网络获取数据
* 5.处理获取的网络数据,并返回响应对象
* 6.遇到异常重新请求

处理网络响应执行步骤:
*1.检查当前执行状态,如果是取消立即返回方法。
* 2.获取状态码判断网络请求状态
* 3.如果是请求成功,判断是否在下载文件或是字符串请求
* 4.对于文件下载,首先检查是否续传是否自动重命名,然后传入以上参数构造文件
* 5.对于字符串,首先获取数据,然后放入缓存,最后返回所得

FileDownloadHandler.java
* 1.先检查时候是续传,如果是构造追加输出流否则直接构造输出流
* 2.构造响应输入流,同时构造文件输出流
* 3.更新状态,如果处于任务取消状态直接返回当前文件
* 4.循环逐个读取输入写出到文件,同时更新状态,如果取消状态立即返回文件
* 5.强制更新状态,关闭流资源
* 6.重命名字段不为空,新建文件去重命名获得文件
* 7.返回文件

StringDownloadHandler.java
* 执行步骤:
*1.获得数据总长度,更新状态
* 2.获取响应数据输入流,指定特定编码
* 3.循环组装获得的字符串,并更新状态
* 4.关闭流返回字符串