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
相关产品推荐
相关产品推荐

