TransWikia.com

ожидание выполнения коррутины и возврат результата в UI

Stack Overflow на русском Asked on December 16, 2021

Пытаюсь выполнить загрузку модели в корутине и нарисовать результат в 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 
}

One Answer

Вы можете переключаться внутри корутины на разные 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
                }
            }
        }

Так же неплохо описана работа с корутинами в документации.

А вот здесь вы можете найти очень хорошие уроки по корутинам.

Answered by Sergei Buvaka on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP