ожидание выполнения коррутины и возврат результата в UI
Пытаюсь выполнить загрузку модели в корутине и нарисовать результат в ImageView. Выполнить рисование в корутине невозможно, так как создается другой поток, если попытаться рисовать после выполнения корутины, то нет ожидания выполнения корутины и рисуется белый ImageView. Как дождаться выполнения корутины, получить результат и продолжить выполнение кода в главном потоке?
fun someFun() {
GlobalScope.launch {
val downloadModel: MDownloadingFragment
val fragmentManager = supportFragmentManager
downloadModel = MDownloadingFragment()
downloadModel.show(fragmentManager, "DOWNLFRAGMENT")
val inputStream = contentResolver.openInputStream(documentUri)!!
val model = getModel(inputStream)
stlModel = model.await()
downloadModel.dismiss()
}
setImage(graph(stlModel))
}
fun getModel(inputStream: InputStream) =
GlobalScope.async(Dispatchers.IO) { parseModel(inputStream) }// suspend fun parseModel
}
Ответы (1 шт):
Автор решения: Sergei Buvaka
→ Ссылка
Вы можете переключаться внутри корутины на разные Dispatcher. Вот вам небольшой пример:
private var viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
uiScope.launch {
withContext(Dispatchers.IO) {
//Do background tasks...
withContext(Dispatchers.Main){
//Update UI
}
}
}
Так же неплохо описана работа с корутинами в документации.
А вот здесь вы можете найти очень хорошие уроки по корутинам.