web-dev-qa-db-fra.com

Lancer une coroutine à partir d'un événement de clic dans un fragment

Quelle est la bonne façon de lancer une coroutine à partir d'un événement de clic défini dans un fragment? De ma compréhension, GlobalScope.launch est utilisé si vous souhaitez lancer une coroutine qui est supposée rester en mémoire pour tout le cycle de vie de l'application. Mais puisqu'un fragment a généralement un cycle de vie plus court que l'application, GlobalScope.launch probablement n'est pas la bonne façon. Je suppose que si je GlobalScope.launch, il pourrait garder le fragment d'être des ordures collectées?

Je n'ai vraiment besoin que de lancer la coroutine à partir d'un gestionnaire d'événements de clic, ce qui signifie qu'il n'y a pas de fonctions parents que je ferais appelerais.

7
AndroidDev

GlobalScope.launch est utilisé si vous souhaitez lancer une coroutine censée rester en mémoire pour tout le cycle de vie de l'application.

Ce n'est pas nécessairement, cela pourrait être utilisé pour toute coroutine qui n'est pas couplée à une activité ou à une phase de l'application que l'utilisateur pouvait naviguer loin de. Par exemple, vous pouvez lancer une tâche qui envoie un message unidirectionnel à votre serveur. Cela finira probablement très bientôt, et vous voulez que cela finit tout ce que l'utilisateur a lieu plus tard.

Je suppose que si je GlobalScope.launch, il pourrait garder le fragment d'être des ordures collectées?

Seulement si la Coroutin conserve une référence au fragment ou une partie de celle-ci, et seulement si elle a le potentiel de fonctionner pendant une longue période.

Plus précisément, la chose typique que vous effectuez dans un événement en cours de clic est une action qui implique votre back-end (c'est-à-dire la mise en réseau), puis met ensuite à jour l'interface utilisateur. Clairement, cela peut prendre beaucoup de temps (surtout en cas de mauvais réseau) et il conserve une référence à l'élément UI qu'il va toucher plus tard. Cela devrait être lié au cycle de vie du fragment.

Quelle est la bonne façon de lancer une coroutine à partir d'un événement de clic défini dans un fragment?

Le moyen le plus simple est comme celui-ci, à la suite de la Documentation officielle :

class MyFragment : Fragment, CoroutineScope by MainScope {

    override fun onDestroy() {
        cancel() // extension on CoroutineScope
    }

    ... rest of your fragment code ...
}

Cela capture l'idiome que vous avez précédemment dû écrire à la main (comme on le voit dans l'autre réponse ici).

1
Marko Topolnik