我如何才能等到我的 Android 应用程序中的协程作用域执行完成?
Posted
技术标签:
【中文标题】我如何才能等到我的 Android 应用程序中的协程作用域执行完成?【英文标题】:How can I wait till the coroutine scope execution finishes in my Android App? 【发布时间】:2021-11-06 02:23:12 【问题描述】:我想澄清一个关于 Kotlin 协程的疑问。
如何延迟我的应用程序中下一行或下一个代码块的执行,直到我正在进行的 API 响应到来?
例如假设我想在用户打开应用程序时调用一个 API,并且只有在我从该 API 获得响应后,我才想绘制视图或其他任何内容。它可以像记录任何内容或显示吐司或类似的东西一样简单。
注意:不使用 runBlocking 或 delay() 方法。
【问题讨论】:
您好,欢迎 Dharmesh!您会注意到这里没有任何帖子带有问候语,因为这会使网站有点过于臃肿,而且这些内容也因文化而异,所以如果您想在这里获得最好的回应,我建议您遵守指南在你的帖子中没有问候。 (我们所有人总是假设!“,) 【参考方案1】:对于一个简单的任务,您可以使用invokeOnCompletion
,它只会在协程完成它的工作后执行。
这是一个小例子
lifecycleScope.launch(Dispatchers.IO)
//heavy calculations
.invokeOnCompletion
Toast.makeText(requireContext(), "Coroutine ended it's job", Toast.LENGTH_SHORT).show()
【讨论】:
感谢您的时间和回答,但 invokeOnCompletion 也无助于我的事业。实际上,我正在使用 Retrofit 在我的启动范围内调用一个 API,并且只有在从该 API 获得响应后,我才想执行我的代码的下一个块。希望你能理解我的担忧。 @DharmeshBasapati 所以,你想从那个调用中得到结果,是吗? 您应该考虑使用带有LiveData
或StateFlow
的存储库模式(总体而言,StateFlow 是更好的方法)。见medium.com/swlh/repository-pattern-in-android-c31d0268118c
好的,谢谢,兄弟。我会调查并更新你。【参考方案2】:
使用 Kotlin Coroutines 的目的是异步处理某些任务。但是,您可以尝试在主调度程序的片段生命周期范围上启动协程,如下所示:
lifecycleScope.launch(Dispatchers.Main)
// do api call and await
// val result = async // api call returning something .await()
【讨论】:
请注意,您将阻塞 UI 线程,因此用户可能会遇到不良的 UI 行为 是的,但我相信这就是 OP 想要的? 嗨@qki,我实际上想显示进度,直到 API 响应到来,然后我只想执行我的代码的下一个块。还有 Macksly - 使用“lifecycleScope”是我们唯一的希望,还是我们可以使用我们想要或需要的任何范围,例如 GlobalScope? @DharmeshBasapati 如果可能,最好使用启动协程的对象的 lifeCycleScope,但是 GlobalScope 也可以工作:) @Macksly 我已经在我的代码中使用了 async 和 await 协程构建器,但不幸的是,它并没有等待 API 响应的到来,而是执行它之后编写的任何代码块。跨度>以上是关于我如何才能等到我的 Android 应用程序中的协程作用域执行完成?的主要内容,如果未能解决你的问题,请参考以下文章
我的协程在 Unity android 应用程序上运行速度较慢