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,提问作者יהודה רומנו
相关产品推荐
相关产品推荐

