Kotlin使用FusedLocationProviderClient获取GPS速度值始终相同问题
问题成因
- 你调用
fusedLocationProviderClient.lastLocation获取的是定位服务缓存的历史最近一次定位结果,返回的it是固定的位置对象,你在循环里重复读取同一个对象的speed属性,值必然是固定的3.4m/s,累加10次自然得到34m/s的结果。 - 你在
addOnSuccessListener回调中直接调用Thread.sleep(300),该回调默认执行在主线程,sleep操作会直接阻塞UI渲染,同时也不会触发新的位置定位请求,完全达不到你预期的每300毫秒获取一次最新速度的效果。 - 你没有向定位服务注册实时位置更新监听,仅单次获取历史定位的逻辑本身就不满足分10次获取实时速度的需求,需要调用
requestLocationUpdates方法传入定位请求参数和位置回调,才能每次拿到最新的位置和速度值。
实现调整建议
你可以按以下逻辑修改代码满足需求:
- 构造定位请求实例,设置300ms的定位间隔、高精度定位权限等参数
- 调用
fusedLocationProviderClient.requestLocationUpdates注册位置回调,在回调中累计速度值、统计获取次数,满10次后注销回调,计算总和并更新UI - 注意提前申请好定位相关权限,在页面销毁或不需要定位时及时注销监听,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Enrico Cortinovis
相关产品推荐
相关产品推荐

