【问题标题】:How can I wait till the coroutine scope execution finishes in my Android App?我如何才能等到我的 Android 应用程序中的协程作用域执行完成?
【发布时间】:2021-11-06 02:23:12
【问题描述】:

我想澄清一个关于 Kotlin 协程的疑问。

如何延迟我的应用程序中下一行或下一个代码块的执行,直到我正在进行的 API 响应到来?

例如假设我想在用户打开应用程序时调用一个 API,并且只有在我从该 API 获得响应后,我才想绘制视图或其他任何内容。它可以像记录任何内容或显示吐司或类似的东西一样简单。

注意:不使用 runBlocking{ } 或 delay() 方法。

【问题讨论】:

  • 您好,欢迎 Dharmesh!您会注意到这里没有任何帖子带有问候语,因为这会使网站有点过于臃肿,而且这些内容也因文化而异,所以如果您想在这里获得最好的回应,我建议您遵守指南在你的帖子中没有问候。 (我们所有人总是假设!“,)

标签: android multithreading kotlin kotlin-coroutines


【解决方案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 响应的到来,而是执行它之后编写的任何代码块。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2016-05-19
相关资源
最近更新 更多