如何在 Android 的生命周期感知协程范围内返回函数值?
Posted
技术标签:
【中文标题】如何在 Android 的生命周期感知协程范围内返回函数值?【英文标题】:How do I return function value in lifecycle-aware coroutine scope in Android? 【发布时间】:2020-06-23 06:57:52 【问题描述】:fun returnValue(): Int
viewModelScope.launch
return 1 // Something like this
我想在上面的 viewModelScope 中返回一些值。我不希望我的功能被挂起。我如何做到这一点?
【问题讨论】:
“在 viewModelScope 中返回一些值”是什么意思?为什么你的函数不是简单的return 1
而不涉及任何launch
?
您可以使用 livedatascope 返回可以在您的活动/片段类中观察到的 livedata
我猜你也想吃蛋糕。不阻塞调用线程,而是直接从这个函数返回值。你不能这样做。您必须在 launch
内进行可暂停的非阻塞计算,并在 launch
块内使用该计算的结果。这意味着您的回调将在您看到结果之前完成,您的应用程序必须接受它。
【参考方案1】:
如果returnValue()
不能被挂起功能,基本上只有两种选择:
-
将返回类型转换为
Deferred<Int>
,并让调用者负责稍后处理返回值。身体变成:
fun returnValue(): Deferred<Int> = viewModelScope.async
return@async 1
-
阻塞线程直到值可用:
fun returnValue(): Int
return runBlocking(viewModelScope.coroutineContext)
return@runBlocking 1
【讨论】:
【参考方案2】:你可以试试这个
suspend fun returnValue(): Int
suspendCoroutine<Int> cont ->
viewModelScope.launch
cont.resume(1)
【讨论】:
以上是关于如何在 Android 的生命周期感知协程范围内返回函数值?的主要内容,如果未能解决你的问题,请参考以下文章
使用 viewLifecycleOwner 的生命周期范围从 Fragment 启动协程
Android LifeCycles之让组件感知生命周期的使用(生命周期观察者)
Jetpack MVVM七宗罪 之二:使用 luanchWhenX 启动协程