OKHTTP原理

设计模式:
Builder、责任链

(1)、当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时;
(2)、okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过execute()及enqueue()方法对同步或异步请求进行处理;
(3)、execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;
(4)、拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
OKHTTP原理_第1张图片

同步、异步调度,线程池。

//TODO 核心代码 开始真正的执行网络请求
          Response getResponseWithInterceptorChain() throws IOException {
            // Build a full stack of interceptors.
            //TODO 责任链
            List<Interceptor> interceptors = new ArrayList<>();
            //TODO 在配置okhttpClient 时设置的intercept 由用户自己设置
            interceptors.addAll(client.interceptors());
            //TODO 负责处理失败后的重试与重定向
            interceptors.add(retryAndFollowUpInterceptor);
            //TODO 负责把用户构造的请求转换为发送到服务器的请求 、把服务器返回的响应转换为用户友好的响应 处理 配置请求头等信息
            //TODO 从应用程序代码到网络代码的桥梁。首先,它根据用户请求构建网络请求。然后它继续呼叫网络。最后,它根据网络响应构建用户响应。
            interceptors.add(new BridgeInterceptor(client.cookieJar()));
            //TODO 处理 缓存配置 根据条件(存在响应缓存并被设置为不变的或者响应在有效期内)返回缓存响应
            //TODO 设置请求头(If-None-Match、If-Modified-Since等) 服务器可能返回304(未修改)
            //TODO 可配置用户自己设置的缓存拦截器
            interceptors.add(new CacheInterceptor(client.internalCache()));
            //TODO 连接服务器 负责和服务器建立连接 这里才是真正的请求网络
            interceptors.add(new ConnectInterceptor(client));
            if (!forWebSocket) {
              //TODO 配置okhttpClient 时设置的networkInterceptors
              //TODO 返回观察单个网络请求和响应的不可变拦截器列表。
              interceptors.addAll(client.networkInterceptors());
            }
            //TODO 执行流操作(写出请求体、获得响应数据) 负责向服务器发送请求数据、从服务器读取响应数据
            //TODO 进行http请求报文的封装与请求报文的解析
            interceptors.add(new CallServerInterceptor(forWebSocket));
        
            //TODO 创建责任链
            Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
                originalRequest, this, eventListener, client.connectTimeoutMillis(),
                client.readTimeoutMillis(), client.writeTimeoutMillis());
        
            //TODO 执行责任链
            return chain.proceed(originalRequest);
          }

彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想 - 简书 https://www.jianshu.com/p/cb444f49a777

okhttp 连接池的实现

OkHttp3将客户端与服务器之间的连接抽象为Connection/RealConnection,为了管理这些连接的复用而设计了ConnectionPool。共享相同Address的请求可以复用连接,ConnectionPool实现了哪些连接保持打开状态以备后用的策略。

OKHTTP原理_第2张图片

OKHTTP原理_第3张图片

OkHttp3的连接池及连接建立过程分析 - 简书 https://www.jianshu.com/p/e6fccf55ca01

你可能感兴趣的:(Android开发)