Android okhttp 网络链接各阶段监控

步骤 1: 添加依赖

在项目的 build.gradle 文件中,添加 OkHttp 依赖:

Groovy 复制代码
implementation 'com.squareup.okhttp3:okhttp:4.11.0'

步骤 2: 创建自定义的 EventListener

创建一个自定义的 EventListener 类:

Kotlin 复制代码
import android.util.Log
import okhttp3.*
import java.io.IOException
import java.net.InetAddress
import java.net.InetSocketAddress
import java.net.Proxy

class LoggingEventListener : EventListener() {
    private var mCallStartTime: Long? = null
    private var mCallEndTime: Long? = null
    private var mDnsStartTime: Long? = null
    private var mDnsEndTime: Long? = null
    private var mConnectStartTime: Long? = null
    private var mSecureConnectStartTime: Long? = null
    private var mSecureConnectEndTime: Long? = null
    private var mConnectEndTime: Long? = null
    private var mRequestHeadersStartTime: Long? = null
    private var mRequestHeadersEndTime: Long? = null
    private var mResponseHeadersStartTime: Long? = null
    private var mResponseHeadersEndTime: Long? = null
    private var mResponseBodyStartTime: Long? = null
    private var mResponseBodyEndTime: Long? = null

    companion object {
        const val TAG = "LoggingEventListener"
    }

    override fun callStart(call: Call) {
        mCallStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event callStart at $mCallStartTime")
    }

    override fun dnsStart(call: Call, domainName: String) {
        mDnsStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event dnsStart at $mDnsStartTime")
    }

    override fun dnsEnd(call: Call, domainName: String, inetAddressList: List<InetAddress>) {
        mDnsEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event dnsEnd at $mDnsEndTime dnsDuration is ${mDnsEndTime!! - mDnsStartTime!!} ms")
    }

    override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) {
        mConnectStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event connectStart at $mConnectStartTime")
    }

    override fun secureConnectStart(call: Call) {
        mSecureConnectStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event secureConnectStart at $mSecureConnectStartTime")
    }

    override fun secureConnectEnd(call: Call, handshake: Handshake?) {
        mSecureConnectEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event secureConnectEnd at $mSecureConnectEndTime secureConnectDuration is ${mSecureConnectEndTime!! - mSecureConnectStartTime!!} ms")
    }

    override fun connectEnd(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy, protocol: Protocol?) {
        mConnectEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event connectEnd at $mConnectEndTime ConnectDuration is ${mConnectEndTime!! - mConnectStartTime!!} ms")
    }

    override fun requestHeadersStart(call: Call) {
        mRequestHeadersStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event requestHeadersStart at $mRequestHeadersStartTime")
    }

    override fun requestHeadersEnd(call: Call, request: Request) {
        mRequestHeadersEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event requestHeadersEnd at $mRequestHeadersEndTime requestHeadersDuration is ${mRequestHeadersEndTime!! - mRequestHeadersStartTime!!} ms")
    }

    override fun responseHeadersStart(call: Call) {
        mResponseHeadersStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event responseHeadersStart at $mResponseHeadersStartTime")
    }

    override fun responseHeadersEnd(call: Call, response: Response) {
        mResponseHeadersEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event responseHeadersEnd at $mResponseHeadersEndTime responseHeadersDuration is ${mResponseHeadersEndTime!! - mResponseHeadersStartTime!!} ms")
    }

    override fun responseBodyStart(call: Call) {
        mResponseBodyStartTime = System.currentTimeMillis()
        Log.i(TAG, "Event responseBodyStart at $mResponseBodyStartTime")
    }

    override fun responseBodyEnd(call: Call, byteCount: Long) {
        mResponseBodyEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event responseBodyEnd at $mResponseBodyEndTime responseHeadersDuration is ${mResponseBodyEndTime!! - mResponseBodyStartTime!!} ms")
    }

    override fun callEnd(call: Call) {
        mCallEndTime = System.currentTimeMillis()
        Log.i(TAG, "Event callEnd at $mCallEndTime responseHeadersDuration is ${mCallEndTime!! - mCallStartTime!!} ms")
    }

    override fun callFailed(call: Call, ioe: IOException) {
        Log.i(TAG,"Request Failed: ${ioe.message}")
    }
}

步骤 3: 在 MainActivity 中发起网络请求

创建一个简单的 MainActivity,发起 HTTP 请求并使用 LoggingEventListener

Kotlin 复制代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import okhttp3.*
import java.io.IOException

class MainActivity : AppCompatActivity() {

    companion object {
        const val TAG = "MainActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 创建 OkHttpClient 并设置自定义 EventListener
        val client = OkHttpClient.Builder()
            .eventListener(LoggingEventListener())
            .build()

        // 创建请求对象
        val request = Request.Builder()
            .url("https://jsonplaceholder.typicode.com/posts/1") // 示例 API
            .build()

        // 发起异步网络请求
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.i(TAG, "Request Failed: ${e.message}")
            }

            override fun onResponse(call: Call, response: Response) {
                Log.i(TAG, "Response: ${response.body?.string()}")
            }
        })
    }
}

步骤 4: 添加权限

AndroidManifest.xml 中添加网络权限:

XML 复制代码
<uses-permission android:name="android.permission.INTERNET" />

步骤 5: 布局文件

创建简单的布局文件 activity_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="OkHttp EventListener Demo"
        android:textSize="18sp"
        android:textStyle="bold" />
</LinearLayout>

运行结果

运行应用后,打开日志工具(Logcat)可以看到网络请求的各个阶段日志,例如:

java 复制代码
I/LoggingEventListener: Event callStart at 1731855030207
I/LoggingEventListener: Event dnsStart at 1731855030212
I/LoggingEventListener: Event dnsEnd at 1731855030213 dnsDuration is 1 ms
I/LoggingEventListener: Event connectStart at 1731855030215
I/LoggingEventListener: Event secureConnectStart at 1731855030581
I/LoggingEventListener: Event secureConnectEnd at 1731855030878 secureConnectDuration is 297 ms
I/LoggingEventListener: Event connectEnd at 1731855030886 ConnectDuration is 671 ms
I/LoggingEventListener: Event requestHeadersStart at 1731855030887
I/LoggingEventListener: Event requestHeadersEnd at 1731855030889 requestHeadersDuration is 2 ms
I/LoggingEventListener: Event responseHeadersStart at 1731855031406
I/LoggingEventListener: Event responseHeadersEnd at 1731855031406 responseHeadersDuration is 0 ms
I/LoggingEventListener: Event responseBodyStart at 1731855031414
I/LoggingEventListener: Event responseBodyEnd at 1731855031415 responseHeadersDuration is 1 ms
I/LoggingEventListener: Event callEnd at 1731855031415 responseHeadersDuration is 1208 ms
相关推荐
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
_丿丨丨_5 小时前
XSS(跨站脚本攻击)
前端·网络·xss
一只栖枝6 小时前
HCIA-Security 认证精讲!网络安全理论与实战全掌握
网络·web安全·网络安全·智能路由器·hcia·it·hcia-security
呼啦啦呼啦啦啦啦啦啦6 小时前
利用pdfjs实现的pdf预览简单demo(包含翻页功能)
android·javascript·pdf
FileLink跨网文件交换6 小时前
文件摆渡系统十大软件|文件摆渡系统如何构建网络安全呢?
网络
idjl7 小时前
Mysql测试题
android·adb
晨欣9 小时前
大型语言模型(LLM)在网络安全中最具商业价值的应用场景(Grok3 回答 DeepSearch模式)
网络·web安全·语言模型
有书Show9 小时前
个人IP的塑造方向有哪些?
网络·网络协议·tcp/ip
HHRL-yx10 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
迈威通信10 小时前
接口黑洞?破!安全堡垒?筑!冰火炼狱?战!MES7114W终极掌控
网络·安全