我们可以通过为 FusedLocationProviderClient 创建扩展函数来获得更好的 API: suspend fun FusedLocationProviderClient.awaitLastLocation 参见下面的实现: // FusedLocationProviderClient 的扩展函数,返回最后已知位置 suspend fun FusedLocationProviderClient.awaitLastLocation 理想的 API 看起来应该像下面这样: fun FusedLocationProviderClient.locationFlow(): Flow<Location> 为了将基于回调的 API 转换为 Flow 将上述步骤应用于当前用例,我们得到以下实现: // 发送位置更新给消费者 fun FusedLocationProviderClient.locationFlow() = callbackFlow<Location val FusedLocationProviderClient.locationFlow() = callbackFlow<Location> { ... }.shareIn( // 让 flow
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient // 最后已知位置 private applicationContext, BuildConfig.MAPS_API_KEY) placesClient = Places.createClient(this) // 构造 FusedLocationProviderClient fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this) 添加位置如下图所示: 下面我们需要写一个 private lateinit var fusedLocationProviderClient: FusedLocationProviderClient // 最后已知位置 private fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this) val mapFragment
优化定位服务:使用低功耗的定位模式(如FusedLocationProviderClient)。减少WakeLock使用:避免长时间持有WakeLock,及时释放。
每个新的收集者都会触发数据流的生产者代码块,同时也会将新的回调加入到 FusedLocationProviderClient。 class LocationDataSource( private val locationClient: FusedLocationProviderClient ) { val locationsSource
电量黑洞:GPS定位优化方案 关键数据:持续GPS耗电280mA/h,网络定位130mA/h 避坑技巧:动态调整定位频率,使用FusedLocationProviderClient 大厂真题直击
例如下面的例子中,使用 callbackFlow 发送位置更新的数据流: // 基于 Channel 实现的冷流,可以发送位置的更新 fun FusedLocationProviderClient.locationFlow