【问题标题】:How do I return function value in lifecycle-aware coroutine scope in Android?如何在 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 块内使用该计算的结果。这意味着您的回调将在您看到结果之前完成,您的应用程序必须接受它。

标签: android android-studio android-asynctask android-lifecycle kotlin-coroutines


【解决方案1】:

如果returnValue()不能被挂起功能,基本上只有两种选择:

  1. 将返回类型转换为Deferred<Int>,并让调用者负责稍后处理返回值。身体变成:
fun returnValue(): Deferred<Int> = viewModelScope.async {
    return@async 1
}
  1. 阻塞线程直到值可用:
fun returnValue(): Int {
    return runBlocking(viewModelScope.coroutineContext) {
        return@runBlocking 1
    }
}

【讨论】:

    【解决方案2】:

    你可以试试这个

    suspend fun returnValue(): Int {
        suspendCoroutine<Int> { cont ->
            viewModelScope.launch {
                cont.resume(1)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 2021-04-17
      • 1970-01-01
      • 2020-11-07
      • 2016-05-04
      • 2020-04-08
      • 2021-12-21
      • 2023-03-24
      相关资源
      最近更新 更多