Android 网络请求OkHttp3流程分析

  • 时间:
  • 浏览:1
  • 来源:大发5分6合_大发5分6合官网

上面的代码中涉及到哪几次常用的类:Request、Response和Call。下面就这哪几次类做完正的介绍。

OkHttp使用Call抽象出原来满足请求的模型,尽管上面是因为 会有多个请求或响应。执行Call有某些法律法律依据,同步或异步。

怎么让使用okHttpClient发起请求。类式:

响应是对请求的回复,含高情况报告码、HTTP头和主体部分。

每原来HTTP请求含高原来URL、原来法律法律依据(GET或POST或某些)、某些HTTP头,请求还是因为 含高原来特定内容类型的数据类的主体部分。

首先从使用出发,其次再结合源码来分析OkHttp3的内部人员实现的,建议某些人儿儿下载 OkHttp 源码跟着本文,过一遍源码。首先来看一下OkHttp3的请求代码。

CallServerInterceptor是拦截器链中最后原来拦截器,负责将网络请求提交给服务器。

由上面的代码可不不还能能得出:

实际上建立连接却说 创建了原来 HttpCodec 对象,它利用 Okio 对 Socket 的读写操作进行封装,Okio 前一天有是因为 再进行分析,现在让某些人儿儿对它们保持原来简单地认识:它对 java.io 和 java.nio 进行了封装,让某些人儿儿更便捷高效的进行 IO 操作。

那还看一下Dispatcher类的相关代码:

该段代码主要实现初始化构建者模式和请求对象,怎么让用URL替换Web套接字URL。其源码如下:

OkHttp的底层是通过Java的Socket发送HTTP请求与接受响应的(,怎么让OkHttp实现了连接池的概念,即对于同一主机的多个请求,真是可不不还能能公用原来Socket连接,而都不 每次发送完HTTP请求就关闭底层的Socket,原来就实现了连接池的概念,怎么让OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。

该类实现了Chain接口,在getResponseWithInterceptorChain调用时好哪几次参数都传的null。主要看proceed法律法律依据,proceed法律法律依据中判断index(此时为0)是是不是大于是因为 等于client.interceptors(List )的大小。是因为 httpStream为null,什么都有首先创建next拦截器链,主须要把索引置为index+1即可;怎么让获取第原来拦截器,调用其intercept法律法律依据。Interceptor 代码如下:

没法 首先来看一下OkHttpClient的源码实现。

AsyncCall实现了execute法律法律依据,首先是调用getResponseWithInterceptorChain()法律法律依据获取响应,怎么让获取成功后,就调用回调的onReponse法律法律依据,是因为 失败,就调用回调的onFailure法律法律依据,并调用Dispatcher的finished法律法律依据。

某些人儿儿来看一下okHttpClient的异步请求法律法律依据。

相关的法律法律依据源码如下:

而NamedRunnable又实现了Runnable接口,来看代码:

从上述源码得知,不管okhttp有哪几次拦截器最后还会走,如下法律法律依据:

最后某些人儿儿用一张图来总结ohhttp的整个请求流程。 

那接下来某些人儿儿在看下Request。类式:

可不不还能能看过NamedRunnable实现了Runnbale接口怎么让是个抽象类,其抽象法律法律依据是execute(),该法律法律依据是在run法律法律依据中被调用的,这也就是因为 NamedRunnable是原来任务,怎么让其子类应该实现execute法律法律依据。下面再看AsyncCall的实现:

在OkHttp,使用如下构造了单例线程运行池,相关源码如下:

从上面的代码可不不还能能看出,首先获取原请求,怎么让在请求中加带头,比如Host、Connection、Accept-Encoding参数等,怎么让根据看是是不是须要填充Cookie,在对原始请求做出处理后,使用chain的procced法律法律依据得到响应,接下来对响应做处理得到用户响应,最后返回响应。再看下原来拦截器ConnectInterceptor的处理:

从法律法律依据名字基本可不不还能能猜到是干嘛的,调用 chain.proceed(originalRequest); 将request传递进来,从拦截器链里拿到返回结果。没法 看一下RealInterceptorChain类。

而newCall又调用了RealCall函数,来看源码:

BridgeInterceptor从用户的请求构建网络请求,怎么让提交给网络,最后从网络响应中提取出用户响应。从最上面的图可不不还能能看出,BridgeInterceptor实现了适配的功能。下面是其intercept法律法律依据:

从上面的代码中可不不还能能看出,首先获取HttpStream对象,怎么让调用writeRequestHeaders法律法律依据写入请求的头部,怎么让判断是是不是须要写入请求的body部分,最后调用finishRequest()法律法律依据将所有数据刷新给底层的Socket,接下来尝试调用readResponseHeaders()法律法律依据读取响应的头部,怎么让再调用openResponseBody()法律法律依据得到响应的body部分,最后返回响应。

可不不还能能看出,在Okhttp中,构建了原来核心为[0, Integer.MAX_VALUE]的线程运行池,它不保留任何最小线程运行数,随时创建更多的线程运行数,当线程运行空闲时非要活60 秒,它使用了原来不存储元素的阻塞工作队列,原来叫做”OkHttp Dispatcher”的线程运行工厂。也却说 说,在实际运行中,当收到10个并发请求时,线程运行池会创建5个线程运行,当工作完成后,线程运行池会在60 s后相继关闭所有线程运行。

其流程可不不还能能用下图表示: 

RealCall实现了Call.Factory接口创建了原来RealCall的实例,而RealCall是Call接口的实现。继续看代码:

从上述源码分析,是因为 当前还能执行原来并发请求,则加入 runningAsyncCalls ,立即执行,怎么让加入 readyAsyncCalls 队列。由此,可不不还能能得出Dispatcher的以下作用。

executorService函数会构造原来线程运行池ExecutorService: