OkHttp通俗易通的总结,没有源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wujainEW/article/details/81611175

OkHttp: 是一个高性能的网络请求库,支持同步和异步,支持拦截器处理,支持线程池,数据转换,参数配置,错误处理等。

OkHttp是一个偏底层的网络请求库,还需要进行一些合理封装,便于使用。

1创建一个OkHttpClient对象。

2创建Request对象。

3通过OkHttpClient的newCall方法传入request获取一个管理请求Call。

4同步的话直接执行execute方法返回Response,

异步的话执行enQueue方法实现CallBack回调。

Interceptor:用来添加,移除,转换请求或者回应头部的信息,或者做一些网络缓存处理。有应用拦截器和网络拦截器。

首先说一下HttpUrlConnection,是Android原生提供一种网络请求方式,在执行I/O方面用到的是InputStream和OutputStream。OkHttp和HttpUrlConnection是同一级的,但是内部用的是source和sink,source相当于InputStream,sink相当于OutputStream。但是source和sink更加强大,支持缓冲和压缩,可以有效减少网络请求过程中产生的流量,内部封装了连接池,当多个网络请求在访问同一个服务器的时候可以共用一个socket。

首先通过构造者模式构建OkHttpClient对象,在构造器中有大量的配置,比如有分发器dispatcher,代理proxy,协议,应用拦截器interceptor和网络拦截器networkInterceptor等配置信息。

之后通过调用OkHttpClient对象的newCall方法添加Request请求,内部其实创建了一个RealCall对象,在RealCall构造器里面做了一些初始化处理。

如果同步请求的话,会调用execute方法,如果异步请求的话,会调用enqueue,内部会通过调用dispatcher的enqueue方法,传入一个AsyncCall对象,然后会调用AsyncCall对象的execute方法,不管是同步还是异步内部都会通过调用getResponeseWithInterceptorChain()方法来返回一个Respnese对象。在getResponeseWithInterceptorChain()方法中有大量的拦截器比如有修改请求头的拦截器,重试重定向拦截器,缓存拦截器等等,而每个拦截器只处理的自己的事情,互不干扰。而这些拦截器是通过RealInterceptorChain来链式调用,采用的是责任链模式。

okHttp主要通过Dispatcher不断的从请求队列RequestQueue中获取请求Call,然后根据是否有缓存来从内存缓存中或是从服务器中获取请求的数据。

内部创建了一个HttpEngine对象,然后通过调用sendRequeut方法和readResponse方法来发送网络请求和读取结果的。sendRequest方法会查找合适的Socket并封装到HttpStream对象中。

readRespone方法通过HttpStream发送请求,然后读取结果封装到Response对象中并返回。

只能算OkHttp的简单总结,内部还有很多东西没有深究,比如连接池、缓存策略,各种模式,拦截器的具体实现等,

有问题希望同学可以指出。

猜你喜欢

转载自blog.csdn.net/wujainEW/article/details/81611175
今日推荐