【问题标题】:How to return fusedLocationProviderClient().lastLocation as flow from a function in kotlin coroutines如何从 kotlin 协程中的函数返回 fusedLocationProviderClient().lastLocation 作为流
【发布时间】:2020-06-14 09:05:51
【问题描述】:

我在做什么

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

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

我的问题是什么

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

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

【问题讨论】:

    标签: android fusedlocationproviderapi kotlin-coroutines kotlinx.coroutines.flow


    【解决方案1】:

    如果要将Deferred 转换为Flow

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

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


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

    【讨论】:

    • 感谢您的回复@Eugen,因为我是 Coroutines 的新手,请解释一下如何在我的案例中使用回调流,我的意思是在这个函数中
    • 嗨,将callbackFlowrequestLocationUpdates 结合起来。您需要的一切都在链接的文档中。我把它留给读者作为练习,它比现成的复制粘贴解决方案更适合学习。
    • 如果其他人仍然对这些东西感到困惑,我认为您应该查看我在同一 medium.com/@m.s.siddique131/… 上的最新博客文章
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2020-12-08
    • 2021-07-20
    • 2017-11-08
    相关资源
    最近更新 更多