如何在获取位置后停止FusedLocationProviderClient对应的Looper?
如何获取一次GPS位置后停止位置更新(无需手动退出Looper)
你不需要手动退出Looper——直接移除FusedLocationProviderClient的位置更新回调即可实现“获取一次位置就停止”的需求。如果强行quit主线程的Looper(你代码里用的Looper.myLooper()!!就是主线程Looper),会导致APP崩溃,完全没必要这么做。
修改后的代码:
private fun setUpLocationListener() { checkSmsPermission(PERMISSION_FINE_LOCATION) val fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this) val locationRequest = LocationRequest().setInterval(2000).setFastestInterval(2000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) // 把回调保存为变量,方便后续移除 val locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult) { Log.d(TAG, "Location found") super.onLocationResult(locationResult) locationResult.locations.firstOrNull()?.let { location -> Log.d(TAG, location.latitude.toString()) Log.d(TAG, location.longitude.toString()) } // 获取到位置后,立即移除回调,停止位置更新 fusedLocationProviderClient.removeLocationUpdates(this) } } fusedLocationProviderClient.requestLocationUpdates( locationRequest, locationCallback, Looper.myLooper()!! ) }
关键说明:
- 不要quit主线程Looper:
Looper.myLooper()!!返回的是主线程的消息循环,quit它会直接终止主线程,导致APP闪退。 - 移除回调是标准做法:FusedLocationProviderClient通过
removeLocationUpdates()方法停止位置更新,这是官方推荐的方式,既安全又能达到你要的“只获取一次位置”的效果。 - 额外优化:用
firstOrNull()替代遍历,更简洁地获取第一个有效位置。
内容的提问来源于stack exchange,提问作者somewhat_incompetent
相关产品推荐
相关产品推荐

