Comment rendre approprié un «appel de méthode de blocage inapproprié»?

29

J'essaie actuellement de tirer davantage parti des coroutines kotlin. Mais je fais face à un problème: lorsque j'utilise moshi ou okhttp à l'intérieur de ces coroutines, je reçois un avertissement:

"appel de méthode de blocage inapproprié"

Quelle est la meilleure façon de résoudre ces problèmes? Je ne veux vraiment pas être inapproprié ;-)

ligi
la source
Je suppose que vous ne voulez pas supprimer l'avertissement, n'est-ce pas?
Saeed Entezari

Réponses:

12

L'avertissement concerne les méthodes qui bloquent le thread actuel et la coroutine ne peuvent pas être correctement suspendues. De cette façon, vous perdez tous les avantages des coroutines et rétrogradez à un travail par thread.

Chaque cas doit être traité d'une manière différente. Pour les appels http suspendables, vous pouvez utiliser le client http ktor . Mais parfois, il n'y a pas de bibliothèque pour votre cas, vous pouvez donc écrire votre propre solution ou ignorer cet avertissement.

Evgeny Bovykin
la source
21
Ignorer l'avertissement n'est presque jamais la bonne chose, vous pouvez au moins exécuter le code de blocage dans withContext(Dispatchers.IO).
Marko Topolnik
2
si vous exécutez le code de blocage avec withContext(Dispatchers.IO)alors il ne bloque plus et l'avertissement n'est pas correct, non?
noloman
@noloman bonne question car "au moins" suppose que quelqu'un qui pose cette question n'a pas. L'avertissement ne disparaît toujours pas lorsque vous introduisez ce wrapper.
Alex
14

Vous obtenez également cet avertissement lors de l'appel d'une fonction de suspension qui est annotée avec @Throws(IOException::class)(Kotlin 1.3.61). Je ne sais pas si cela est prévu ou non. Quoi qu'il en soit, vous pouvez corriger cet avertissement en supprimant cette annotation ou en la modifiant en Exceptionclasse.

marque
la source
Appelons-le supprimer, pas réparer :) Je suppose que l'analyseur statique le met en évidence parce que la méthode qui lève IOException est généralement bloquante et prend un temps précieux pour terminer.
Ivan Shafran Il y a
J'ai trouvé cette explication sur IOException utile: discuter.kotlinlang.org/t/…
Ivan Shafran il y a