OkHttp源码学习之EventListener

851 阅读2分钟

EventListener作用

OkHttpEventListener 是一个用于监控 HTTP 请求与响应事件的机制。通过 EventListener,你可以深入了解 HTTP 请求的执行过程,包括连接建立、数据传输、响应接收等细节,适合进行性能监控、调试和故障排查。

主要功能:

  1. 监控网络事件:捕获 HTTP 请求生命周期中的各个关键事件。
  2. 性能分析:分析每个阶段的耗时,帮助识别性能瓶颈。
  3. 调试与日志记录:记录详细的事件日志,便于排查问题。
  4. 行为定制:为特定场景添加自定义逻辑(例如统计、限流等)。

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 |

+------------------------------------------------------------+