web-dev-qa-db-fra.com

Comment obtenez-vous sur un thread d'interface utilisateur d'un Android Kotlin Coroutines

Je n'ai pas compris à quel point les coroutines de Kotlin fonctionnent. Je dois faire un long travail sur un fil asynchrone et obtenir le résultat sur le fil de l'interface utilisateur dans un Android app. Quelqu'un peut-il me donner quelques exemples? Par exemple

private fun getCountries(){
        viewModelScope.launch { 
            val a = model.getAllCountries()
            countriesList.value = a
        }
}

deux déjeuner Model.getallCountries () Async mais à la fin, comment puis-je obtenir en résulter au fil de l'interface utilisateur?

6
Graziano Rizzi

Je dois faire un long travail sur un fil asynchrone

Il n'y a rien comme un fil asynchrone, en fait. Si vos opérations de réseau sont synchronisées ou ASYNC sont décidées par la mise en œuvre de l'API réseau que vous utilisez.

Si vous avez une opération de réseau de blocage, il restera de blocage même lorsque vous appliquez des coroutines. La valeur des Coroutines pour cet étui d'utilisation est limitée à la rendant un peu plus facile de transférer le résultat au fil de l'interface utilisateur.

Vous y parvenez en lançant une coroutine avec le répartiteur d'interface utilisateur (la valeur par défaut), puis passez à un pool de threads pour effectuer une opération de blocage sans bloquer le fil de l'interface utilisateur:

    viewModelScope.launch { 
        countriesList.value = withContext(Dispatchers.IO) {
            model.getAllCountries()
        }
    }

Notez qu'un filetage à l'intérieur de la piscine de thread sous-jacente Le répartiteur IO sera toujours bloqué, de sorte que l'utilisation des ressources du système ne fait pas de différence. Il y aura autant de threads natifs bloqués car il y aura des appels réseau simultanés.

0
Marko Topolnik