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é ;-)


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.