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

Kotlin中OkHttp的onResponse回调仅可修改TextView属性无法修改Button属性

问题根因

OkHttp 的onResponse回调默认运行在工作线程,Android 系统要求所有 UI 更新操作必须在主线程执行。部分版本 ROM 的TextView setText逻辑没有做严格的线程校验,所以能侥幸运行成功,但 Button、输入框、Switch 等控件的属性修改逻辑有严格的线程检查,一旦在非主线程执行就会抛出异常。

解决方案

将所有 UI 更新的代码切换到主线程执行即可,修改后的onResponse参考代码如下:

override fun onResponse(call: Call, response: Response) {
    val body = Klaxon().parse<API_result>(response.body!!.string())
    // 切换到主线程执行UI操作
    runOnUiThread {
        findViewById<TextView>(R.id.windSpeed).text = (body?.wind?.speed?.times(3.6)).toString() + " km/h"
        findViewById<TextView>(R.id.temperature).text = body?.main?.temp.toString() + " C"
        findViewById<TextView>(R.id.airPressure).text = body?.main?.pressure.toString() + " hPa"
        // 修改Button属性不再崩溃
        findViewById<Button>(R.id.fillOutForm).text = "Test"
    }
}

异常现象说明

  • 可读取控件属性、不可写入:控件属性读取逻辑通常没有线程校验,写入逻辑触发UI刷新时会触发线程检查
  • 崩溃前按钮文本短暂更新:工作线程修改了控件内存中的属性值,还没等到系统校验线程、触发完整绘制流程就崩溃,因此会出现短暂更新的视觉效果

内容的提问来源于stack exchange,提问作者philale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:54:05