Як зробити "невідповідним виклик методу блокування" відповідним?


29

На даний момент я намагаюся більше використовувати котлінові процедури. Але я зіткнувся з проблемою: коли я використовую моші або okhttp всередині цих процедур, я отримую попередження:

"невідповідний виклик методу блокування"

Який найкращий спосіб виправити це? Я дуже не хочу бути недоречним ;-)


Я припускаю, що ви не хочете придушувати попередження, чи не так?
Саїд Ентезарі

Відповіді:


12

Попередження стосується методів, які блокують поточну нитку та кореневу програму неможливо належним чином призупинити. Таким чином, ви втрачаєте всі переваги супроводу та знову переходите на одну роботу за нитку.

Кожен випадок повинен розглядатися по-різному. Для призупинених http-дзвінків можна використовувати ktor http-клієнт . Але іноді для вашої справи немає бібліотеки, тож ви можете написати власне рішення або проігнорувати це попередження.


20
Ігнорування попередження майже ніколи не є правильним, ви можете принаймні запустити код блокування withContext(Dispatchers.IO).
Марко Топольник

2
якщо запустити код блокування, withContext(Dispatchers.IO)тоді він більше не блокується, і попередження невірно, правда?
ноломан

@noloman хороше запитання, оскільки "принаймні" припускає знання, які хтось, хто задає це питання, не має. Однак попередження не зникає, коли ви вводите цю обгортку.
Олексій

14

Це попередження ви також отримуєте, коли викликаєте функцію призупинення, яка позначається за допомогою @Throws(IOException::class)(Kotlin 1.3.61). Не впевнений, це призначено чи ні. У будь-якому випадку ви можете виправити це попередження, видаливши це примітку або змінивши його на Exceptionклас.


Назвемо це придушенням, а не виправленням :) Я вважаю, що статичний аналізатор підкреслює це, оскільки метод, який кидає IOException, зазвичай блокує і вимагає певного часу, щоб закінчити.
Іван Шафран

Я вважаю це пояснення щодо IOException корисним: дискусія.kotlinlang.org/t/…
Іван Шафран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.