Android 13中Geocoder.getFromLocation回调线程不一致的问题及解决
Android 13 (API 33) Geocoder回调线程不一致导致UI异常的问题及修复
问题现象
在Android 13(API 33)环境下,调用Geocoder.getFromLocation()的lambda回调时,线程执行存在差异:
- 首次触发回调时,代码运行在非主线程
- 后续触发回调时,代码切换到主线程(推测是系统启用了缓存机制)
这种线程不一致会导致:首次启动应用时,若直接在回调内修改UI,应用既不会崩溃也无错误日志,但UI会显示空白;后续启动则能正常展示内容。
错误代码示例
geocoder.getFromLocation( latitude, longitude, 1 ) { textView.text = it[0].getAddressLine(0) } // 注:原代码存在语法笔误,此处补全了成员调用的点符号
解决方法
通过绑定主线程Looper的Handler,强制将UI操作切换到主线程执行,确保无论回调在哪个线程触发,UI更新都符合Android线程规则:
geocoder.getFromLocation( latitude, longitude, 1 ) { addresses -> Handler(getMainLooper()).post { textView.text = addresses[0].getAddressLine(0) } }
内容的提问来源于stack exchange,提问作者ilizma
相关产品推荐
相关产品推荐

