我正在重写
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
可能会做什么有一个模糊的想法,但我认为我需要一个更智能的答案 - 代码可能似乎工作,但要狡猾。
如果我将
fireAndForgetMethod()
标记为 suspend
并从 analyze()
对其进行正常调用,它会立即从调用中返回吗?这是正确的技术吗?我不需要方法的答案。
如果不是这样,我应该使用什么范围
launch {}
?
是否有另一种(已批准的)方法可以在不阻塞的情况下执行冗长的操作
analyze()
? (长方法所需的数据来自来自analyze()
,所以不知何故这就是我需要触发它的地方)。工作线程怎么样,并在线程中设置一个标志来表示“GO!”?
analyze()
标记为 suspend
方法。然后,对 fireAndForgetMethod()
的正常调用将等待该方法完成,然后再继续。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")
如果您确实希望该函数在后台执行,而没有任何可以等待它的作用域,那么使用
GlobalScope
应该没问题。