我如何才能等到我的 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 所以,你想从那个调用中得到结果,是吗? 您应该考虑使用带有LiveDataStateFlow 的存储库模式(总体而言,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 应用程序中的协程作用域执行完成?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候释放android服务中的协程资源?

我的协程在 Unity android 应用程序上运行速度较慢

如何让 android 应用程序等到电话完成?

我怎样才能等到 Qt 的 keyevents 中的每个进程完成?

如何等到相机在android中捕获图像?

Pyserial readline() 并等到收到一个值才能继续