如何在 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 启动协程

androidx.lifecycle 生命周期感知型组件实现原理

Android mvvm 之 LiveData 的原理

Android Jetpack -- Lifecycles篇