Android OkHttp高频面试题解析
一、OkHttp核心流程
整体请求流程
创建OkHttpClient实例,构建Request对象,通过newCall()生成Call对象。
同步请求调用execute(),异步请求调用enqueue(),最终通过拦截器链处理请求和响应。
拦截器链(Interceptor Chain)
OkHttp通过责任链模式依次执行拦截器,核心拦截器包括:
RetryAndFollowUpInterceptor:处理重试和重定向(如连接异常或HTTP状态码为3xx时)。
BridgeInterceptor:添加通用请求头(如Content-Type、Cookie),处理响应头(如Gzip解压)。
CacheInterceptor:根据缓存策略(如Cache-Control)判断是否使用本地缓存。
ConnectInterceptor:建立TCP连接,复用连接池中的空闲连接。
CallServerInterceptor:向服务器发送请求并读取响应数据。
二、核心机制与高频问题
连接池(Connection Pool)
作用:复用TCP连接,减少握手开销,提升性能。
管理策略:
默认维护5个空闲连接,最长存活5分钟。
通过ConnectionPool自动清理空闲连接,防止内存泄漏。
同步与异步请求实现
同步请求:直接在当前线程执行,阻塞直到获取响应。
异步请求:通过Dispatcher管理线程池,任务加入队列后由后台线程执行,回调结果至主线程。
设计模式应用
责任链模式:拦截器链处理请求的分层逻辑。
建造者模式:OkHttpClient和Request通过Builder构建复杂对象。
外观模式:OkHttpClient封装底层HTTP通信细节。
三、高频面试题
OkHttp如何复用TCP连接?
通过ConnectionPool维护空闲连接,相同主机和端口的请求优先复用已有连接,减少三次握手开销。
应用拦截器与网络拦截器的区别?
应用拦截器:最早执行,可修改原始请求(如添加全局Header)。
网络拦截器:在ConnectInterceptor之后执行,可获取网络层数据(如重定向后的请求)。
OkHttp如何处理缓存?
CacheInterceptor根据响应头(如Cache-Control、ETag)判断是否缓存,支持磁盘缓存策略。
OkHttp的优势有哪些?
支持HTTP/2和WebSocket,内置连接池和缓存机制,拦截器扩展性强,API简洁易用。
Dispatcher的作用是什么?
管理异步请求的线程池和请求队列,控制最大并发请求数(默认64),防止资源竞争。
四、示例代码(拦截器添加)
java
Copy Code
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor()) // 应用拦截器
.addNetworkInterceptor(new StethoInterceptor()) // 网络拦截器
.build();
五、优化建议
连接池调优:根据业务场景调整ConnectionPool参数(如最大空闲连接数)。
自定义拦截器:实现日志记录、请求重试或鉴权逻辑(如自动添加Token)。
缓存策略:结合服务器响应头合理配置磁盘缓存大小和有效期。