调用即发即忘方法 - 哪个范围?

问题描述 投票:0回答:1

我正在重写

analyze()
ImageAnalysys.Analyzer
方法,所以我希望它尽快执行并返回。我有一个想要从
analyze()
调用的方法,它将操作一些成员变量,并最终想要通知
View
它有新内容要显示,但它很长。因此,我想将该方法排队等待执行,但立即返回到
analyze()

我正在使用

GlobalScope.launch { fireAndForgetMethod() }
并且(显然)按预期工作,但我收到“精致的 API”警告,并且帮助弹出窗口表明这不是一个好主意。我见过
MainScope().launch {}
并提到了 viewModelScope 和 LifecycleScope。但后来我看到了诸如 How to: Grpc fire andforget async api call in Kotlin 这样的文章,这表明即使只是使用“fire-and-forget”也是不鼓励的。

我最近了解了 JavaScript 的

async
await
Promise
架构,因此我对 Kotlin 的
suspend
可能会做什么有一个模糊的想法,但我认为我需要一个更智能的答案 - 代码可能似乎工作,但要狡猾。

  1. 如果我将

    fireAndForgetMethod()
    标记为
    suspend
    并从
    analyze()
    对其进行正常调用,它会立即从调用中返回吗?这是正确的技术吗?我不需要方法的答案。

  2. 如果不是这样,我应该使用什么范围

    launch {}

  3. 是否有另一种(已批准的)方法可以在不阻塞的情况下执行冗长的操作

    analyze()
    ? (长方法所需的数据来自来自
    analyze()
    ,所以不知何故这就是我需要触发它的地方)。工作线程怎么样,并在线程中设置一个标志来表示“GO!”?

kotlin asynchronous scope
1个回答
0
投票
  1. 您还必须将
    analyze()
    标记为
    suspend
    方法。然后,对
    fireAndForgetMethod()
    的正常调用将等待该方法完成,然后再继续。
  2. 理想情况下,您应该根据您在
    coroutineScope(Dispatchers.IO | DEFAULT | MAIN)
    中所做的工作类型来使用
    fireAndForgetMethod()
    。不过,当作用域完成时,它将等待所有任务也完成。即,这将首先打印
    "Async"
    ,然后再到达
    "Test"
    :
runBlocking { // Only needed if your function is not already marked as `suspend`
    coroutineScope {
        launch {
            delay(5000)
            println("Async")
        }
    }
}
println("Test")
  1. 您可以使用线程。如果您的系统/框架(例如 Android、Spring 等)支持,您可以使用一些后台工作者。

如果您确实希望该函数在后台执行,而没有任何可以等待它的作用域,那么使用

GlobalScope
应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.