1

我在做什么

因此,我正在开发一个天气预报应用程序,在该应用程序中我使用 fusedLocationProviderClient.lastLocation 访问设备位置,我们大多数人都知道位置提供程序返回一个任务,因此我正在使用延迟协程,以便每当任务完成时它都会给出我是设备位置,请查看代码以便更好地理解

private fun getLastDeviceLocation(): Deferred<Location?> {
        return if (hasLocationPermission())
            fusedLocationProviderClient.lastLocation.asDeferred()
        else
            throw LocationPermissionNotGrantedException()
    }

我的问题是什么

但是现在我希望我的位置是一个实时位置,因此我必须使用协程流,这样每当我的位置发生变化时,我就可以自动获取新位置的天气,但是因为我是 kotlin 协程的新手我不知道如何实现这一点以及我如何能够使用延迟的流,

任何人都可以请帮助我,或者如果这不可行,请建议我做一些其他的工作来实现我的目标提前谢谢

4

1 回答 1

2

如果要转换DeferredFlow

val lastLocationFlow: Flow<Location> = flow {
    emit(fusedLocationProviderClient.lastLocation.asDeferred().await())
}

flow是最基本的流量生成器。它需要一个可挂起的块作为参数,它负责发出值。Deferred.await()将暂停执行,直到任务返回一个Location(或null)。然后流程将发出值并完成。


如果你想requestLocationUpdates从回调转换为Flow,你可以使用callbackFlow.

于 2020-06-14T09:39:40.547 回答