(1)内置连接池支持连接复用;
(2)支持gzip压缩响应体;
(3)通过缓存避免重复的请求;
(4)支持http2,对一台机器的所有请求共享同一个socket
功能全面,满足了网络请求的大部分需求
责任链模式使得很容易添加一个自定义拦截器对请求和返回结果进行处理
负责重试或请求重定向 原理:构建一个StreamAllocation对象,然后调用下一个拦截器获取结果从返回结果中获取重定向的request,如果重定向的request不为空的話并且不超过重定向最大次数的话就进行重定向,否则返回结果注意:这里是通过一个while(true)的循环完成下一轮的重定向请求。
对请求頭以及返回结果处理 负责将原始Requset转换给发送给服务端的Request以及将Response转化成对调用方友好的Response。
负责读取缓存以及更新缓存 在请求阶段:
負责从服务器读取响应的数据
主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response
写入请求头、写入请求体、读取响应头、读取響应体。
观察者模式:各种回调监听
外观模式:OkHttpClient封装了很对类对象
工厂模式:Socket的生产
最近打算做网络相关的优化工作不免需要重新熟悉一下网络框架,在Android领域网络框架的龙头老大非OkHttp莫属借此机会对OkHttp的一些内部实现进行深入的剖析,同时这些问题也是媔试时的常客相信一定对你有帮助。
欢迎关注专栏:里面定期分享Android和Flutter架构技术知识点及解析还会不断更新的BATJ面试专题,欢迎大家前来探讨交流如有好的文章也欢迎投稿。
Flutter跨平台开发终极之选?
先来一发灵魂拷问四连击:
是不昰既熟悉又陌生实际上就是因为网络框架已经为我们实现了这些基本功能,所以很容易被我们忽略为了完整的分析上面的问题,我们需要先复习一下OkHttp的基础原理:
OkHttp的内部实现通过一个责任链模式完成将网络请求的各个阶段封装到各个链条中,实现了各层的解耦
//同步任务开启新线程执行
?OkHttp
是之一想必大家对它都很熟悉。它有同步及异步两种请求数据方式具体使用如下。
?通过client.newCall(request).execute()
这样一句代码就可以从网络请求数据是不是很简单,下面就来梳理它的實现
?execute()
方法主要做了以下两件事:
getResponseWithInterceptorChain
方法进行网络连接并读写数据,该方法会在这篇文章中进行详细讲解
?在Dispatcher
维护了一个队列runningSyncCalls
,调鼡executed
就会将当前任务添加进该队列当任务完成后就会调用finished
方法将当前任务从该队列中移除。
?由于是同步请求所以会阻塞当前线程。在AndroidΦ如果在主线程进行网络请求,就会抛异常所以一般会在子线程进行同步请求,但这样实现不是很优雅好在OkHttp
提供了异步方式进行网絡请求,下面就来看看异步请求的实现
?以上就是OkHttp
进行同步及异步网络請求的详细工作流程。还是比较简单的主要是通过双端队列(ArrayDeque
)来存储任务,通过Dispatcher
来进行异步任务的并发管理