DEDZTBH
DEDZTBH

Reputation: 196

Returning a value produced in Kotlin coroutine

I am trying to return a value generated from coroutine

fun nonSuspending (): MyType {
    launch(CommonPool) {
        suspendingFunctionThatReturnsMyValue()
    }
    //Do something to get the value out of coroutine context
    return somehowGetMyValue
}

I have come up with the following solution (not very safe!):

fun nonSuspending (): MyType {
    val deferred = async(CommonPool) {
        suspendingFunctionThatReturnsMyValue()
    }
    while (deferred.isActive) Thread.sleep(1)
    return deferred.getCompleted()
}

I also thought about using event bus, but is there a more elegant solution to this problem?

Thanks in advance.

Upvotes: 12

Views: 18056

Answers (2)

Andres Rivas
Andres Rivas

Reputation: 162

You can use this:

private val uiContext: CoroutineContext = UI
private val bgContext: CoroutineContext = CommonPool

private fun loadData() = launch(uiContext) {
 try {
  val task = async(bgContext){dataProvider.loadData("task")}
  val result = task.await() //This is the data result
  }
}catch (e: UnsupportedOperationException) {
        e.printStackTrace()
    }

 }

Upvotes: 0

Kirill Rakhman
Kirill Rakhman

Reputation: 43861

You can do

val result = runBlocking(CommonPool) {
    suspendingFunctionThatReturnsMyValue()
}

to block until the result is available.

Upvotes: 29

Related Questions