面试系列——OkHttp使用和原理分析

Posted BridgeGeorge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试系列——OkHttp使用和原理分析相关的知识,希望对你有一定的参考价值。

OkHttp 框架分析

基于OkHttp 3.4.0.

支持的协议

HTTP 1.1 HTTP2 SPDY_3

重要类

OkHttpClient

构造Call 请求 , 用来发送Http请求 和 读取返回内容。

Request 和 Response

request 代表一个请求,不可变
response 代表一个响应 可变

Call 和 RealCall

负责请求的调度(同步的话走当前线程发送请求,异步的话则使用OkHttp内部的线程池进行);同时负责构造内部逻辑责任链,并执行责任链相关的逻辑,直到获取结果。虽然OkHttpClient是整个OkHttp的核心管理类,但是真正发出请求并且组织逻辑的是RealCall类,它同时肩负了调度和责任链组织的两大重任。

Dispatcher

请求调度类,管理异步请求的调度策略
最大并发数 64 单个host 最大并发数 5
异步请求执行队列
异步请求等待队列
同步请求执行队列

优势

  • 调度线程池Disptcher实现了高并发,低阻塞的实现
  • 采用Deque作为缓存,先进先出的顺序执行
  • 任务在try/finally中调用了finished函数,控制任务队列的执行顺序,而不是采用锁,减少了编码复杂性提高性能

ConnectionPool

请求连接池,Address相同 则可以复用连接,目的是复用socket网络连接 提升网络请求效率;

拦截器

  • client.Interceptors-用户自定义拦截器
  • retryAndFollowUpInterceptor——失败和重定向拦截器
  • BridgeInterceptor——封装request和response拦截器
  • CacheInterceptor——缓存相关的过滤器,负责读取缓存直接返回、更新缓存
  • ConnectInterceptor——连接服务,负责和服务器建立连接 这里才是真正的请求网络
  • CallServerInterceptor——执行流操作(写出请求体、获得响应数据) 负责向服务器发送请求数据、从服务器读取响应数据 进行http请求报文的封装与请求报文的解析

关于 OKIO

OkHttp 内部采用 OKIO 来实现 网络IO 磁盘IO 操作,OKIO 是在Java IO 的基础上 进行二次封装,并不是重新构造了一套新的IO方法

原生IO存在的问题:

原生IO API 不够简洁,buffer缓存无法复用 不够高效,无超时机制,通过超时机制来实现socket的释放;

OKIO 解决的问题;

  1. 易于使用,抽象sink (输出流)source(输入流) 方法
  2. 优化buffer缓存,采用SegmentPool 优化内存缓存,避免频繁内存copy
  3. 超时机制,AsyncTimeout ,通过WatchDog 守护线程 触发超时;
  4. 封装了Gzip 流解压缩的细节,供OkHttp 调用;

设计模式

单例模式

平台的Platform.get()

构造者模式

OkHttpClient 构造,Request 请求的构造;

外观模式

仅通过 OkHttpClient 来封装框架内部细节 ,对外只保留对外核心API;

策略模式

不同的HttpStream 策略

责任链模式

采用拦截器建立网络连接 和管理请求响应等;

享元模式

利用连接池连接复用。;

观察者模式

HTTP 2.0 PushObserver 等。

以上是关于面试系列——OkHttp使用和原理分析的主要内容,如果未能解决你的问题,请参考以下文章

面试官:简单说下 okHttp原理分析~

OkHttp面试之--OkHttp的整个异步请求流程

OkHttpOkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

《OkHttp源码分析》之 Http请求原理

网络请求框架OkHttp3全解系列:OkHttp的基本使用

面试系列——Retrofit 框架分析使用总结