用于多个数据库调用的 Kotlin 协程

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

我对 Kotlin 协程还很陌生,并且想在我们的应用程序中引入它们,以满足我必须对数据库进行三个读取调用的要求,基本上从不同的表中获取数据并返回一个组合来自三个调用的数据的实体。

这是我准备的代码片段,看起来运行良好。

return runBlocking {
      val firstResult = async { dbReadOne(param1, param2).verySmallProcessing() }
      val secondResult = async {
        repo.dbReadTwo(
          param1,
          param2
        )
      }
      val thirdResult = async {
        repo.dbReadThree(
          param1,
          param2
        )
      }

    X(firstResult.await(),
        secondResult.await().takeIf { it.isPresent }
          ?.let {//some processing here}, 
       thirdResult.await().takeIf { it.isPresent }
          ?.let {//some processing here})
    }

我有几个疑问,我想了解代码的改进。

a)我在这里是否正确使用了 runBlocking,或者我应该将我的三个调用包装在不同的构造中,例如 coroutineScope?

b) 可以从 runBlocking 返回吗?或者我应该缩小 runBlocking() 的范围,但在这种情况下,我将如何从异步调用中获取值?

kotlin asynchronous kotlin-coroutines coroutine
1个回答
0
投票
  1. 您可以通过将代码包装起来来改进代码
withContext(Dispatchers.IO) {
  // your code here
}
  1. 使用非阻塞的 coroutineScope,这意味着它不会阻塞主线程

  2. 使用协程时可以正常返回

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