EventListener作用
OkHttp 的 EventListener 是一个用于监控 HTTP 请求与响应事件的机制。通过 EventListener,你可以深入了解 HTTP 请求的执行过程,包括连接建立、数据传输、响应接收等细节,适合进行性能监控、调试和故障排查。
主要功能:
- 监控网络事件:捕获 HTTP 请求生命周期中的各个关键事件。
- 性能分析:分析每个阶段的耗时,帮助识别性能瓶颈。
- 调试与日志记录:记录详细的事件日志,便于排查问题。
- 行为定制:为特定场景添加自定义逻辑(例如统计、限流等)。
EventListener源码分析
使用快捷键,抓取了一下EventListener这个类包含的方法名称,大概如下
1. Call Events(请求相关事件)
callStart: 请求开始时触发。callEnd: 请求成功结束时触发。callFailed: 请求失败时触发。
2. DNS Events(DNS 解析事件)
dnsStart: 开始解析域名时触发。dnsEnd: 完成域名解析时触发,包含解析结果。
3. Connection Events(连接相关事件)
connectStart: 开始连接服务器(包括 TCP 和 TLS 握手)。connectEnd: 连接成功时触发。connectFailed: 连接失败时触发。secureConnectStart: 开始 TLS 握手时触发。secureConnectEnd: TLS 握手完成时触发。
4. Request/Response Events(请求与响应事件)
requestHeadersStart: 开始发送请求头。requestHeadersEnd: 请求头发送完成。requestBodyStart: 开始发送请求体。requestBodyEnd: 请求体发送完成。responseHeadersStart: 开始接收响应头。responseHeadersEnd: 响应头接收完成。responseBodyStart: 开始读取响应体。responseBodyEnd: 响应体读取完成。
5. 其他事件
connectionAcquired: 连接池中取出连接时触发。connectionReleased: 连接释放到连接池时触发。
EventListener使用
1.自定义 EventListener 创建一个继承自 EventListener 的类并重写需要的事件方法
class CustomEventListener : EventListener() {
override fun callStart(call: Call) {
println("Call started: ${call.request().url}")
}
override fun callEnd(call: Call) {
println("Call ended: ${call.request().url}")
}
override fun callFailed(call: Call, ioe: IOException) {
println("Call failed: ${call.request().url}, Error: ${ioe.message}")
}
}
2.将 EventListener 应用到 OkHttpClient 在构建 OkHttpClient 时通过 eventListenerFactory 设置:
val client = OkHttpClient.Builder()
.eventListenerFactory { CustomEventListener() }
.build()
整个EventListener大约覆盖了下面的Okhttp生命周期
+------------------------------------------------------------+
| OkHttp 网络请求生命周期 |
+------------------------------------------------------------+
| Start Request -> DNS Start -> DNS End -> |
| Connect Start -> Connect End -> |
| Secure Connect Start -> Secure Connect End -> |
| Request Headers Start -> Request Headers End -> |
| Request Body Start -> Request Body End -> |
| Response Headers Start -> Response Headers End -> |
| Response Body Start -> Response Body End -> |
| End Request |
+------------------------------------------------------------+