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

如何在获取位置后停止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:52:38