data class Result<out T>(val success: T? = null, val error: Throwable? = null) private fun loadData() = launch(uiContext) { view.showLoading() // ui thread val task = async(bgContext) { dataProvider.loadData("Task") } val result: Result<String> = task.await() // non ui thread, suspend until the task is finished if (result.success != null) { view.showData(result.success) // ui thread } else if (result.error != null) { result.error.printStackTrace() } }