You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp3发起HTTP请求仅生效一次,后续点击按钮无响应求助

问题排查与修复方案

1. 未关闭Response Body导致连接池耗尽

OkHttp的连接池默认有数量限制,当你调用response.body.toString()后未关闭ResponseBody,会导致该连接被长期占用,后续请求无法获取可用连接,从而无响应。修复方式是在使用完响应内容后确保关闭响应体:

override fun onResponse(call: Call, response: Response) {
    if (response.isSuccessful) {
        // 用string()获取实际响应内容,该方法会自动关闭ResponseBody
        val responseContent = response.body?.string()
        runOnUiThread {
            textView.text = responseContent ?: "Empty response"
        }
    }
    // 兜底关闭响应体,释放连接
    response.close()
}

注意:response.body.toString()只是打印对象内存地址,不会读取响应内容也不会关闭响应体,必须用string()或bytes()方法来获取内容并触发自动关闭。

2. 复用OkHttpClient实例

每次调用makeGetRequest都新建OkHttpClient会浪费资源,且不利于连接复用。应该将OkHttpClient声明为类成员变量,仅初始化一次:

// 类成员变量,全局复用
private val client = OkHttpClient()
private lateinit var textView: TextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    // 提前初始化TextView引用,避免每次点击重复查找控件
    textView = findViewById(R.id.textView)
    // 一次性绑定按钮点击事件
    findViewById<Button>(R.id.button).setOnClickListener {
        makeGetRequest()
    }
}

private fun makeGetRequest() {
    val request = Request.Builder().url("http://192.168.1.54/trigger").build()

    client.newCall(request).enqueue(object : okhttp3.Callback {
        override fun onFailure(call: Call, e: IOException) {
            runOnUiThread {
                textView.text = "failed to send request: ${e.message}"
            }
        }

        override fun onResponse(call: Call, response: Response) {
            val responseContent = response.body?.string()
            runOnUiThread {
                textView.text = if (response.isSuccessful) {
                    responseContent ?: "Empty response"
                } else {
                    "Request failed: ${response.code}"
                }
            }
            response.close()
        }
    })
}

3. 检查按钮点击事件绑定逻辑

确保按钮点击事件是在onCreate中一次性绑定,不要在makeGetRequest方法内重复绑定,避免出现绑定失效或重复触发的问题。

4. 添加日志辅助排查

在回调方法中添加日志,确认后续点击时请求是否被发起,以及具体失败原因:

import android.util.Log

override fun onFailure(call: Call, e: IOException) {
    Log.e("OkHttpDebug", "Request failed", e)
    runOnUiThread {
        textView.text = "failed to send request: ${e.message}"
    }
}

override fun onResponse(call: Call, response: Response) {
    Log.d("OkHttpDebug", "Response code: ${response.code}")
    // 后续处理逻辑
}

通过以上调整,即可解决仅首次点击有效、后续无响应的问题。

内容的提问来源于stack exchange,提问作者יהודה רומנו

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:02:37