Как сделать «неправильный вызов метода блокировки» соответствующим?

29

В настоящее время я пытаюсь использовать котлин сопрограммы больше. Но я сталкиваюсь с проблемой: при использовании moshi или okhttp внутри этих сопрограмм я получаю предупреждение:

«неподходящий вызов метода блокировки»

Каков наилучший способ исправить это? Я действительно не хочу быть неуместным ;-)

Ligi
источник
Я полагаю, вы не хотите подавить предупреждение, не так ли?
Саид Энтезари

Ответы:

12

Предупреждение касается методов, которые блокируют текущий поток, и сопрограмма не может быть правильно приостановлена. Таким образом, вы теряете все преимущества сопрограмм и снова понижаете до одного задания на поток.

Каждый случай должен быть обработан по-своему. Для приостановленных вызовов http вы можете использовать http-клиент ktor . Но иногда для вашего случая нет библиотеки, поэтому вы можете написать собственное решение или проигнорировать это предупреждение.

Евгений Бовыкин
источник
21
Игнорирование предупреждения почти никогда не является правильным, по крайней мере, вы можете запустить код блокировки withContext(Dispatchers.IO).
Марко Топольник
2
если вы запускаете код блокировки с помощью, withContext(Dispatchers.IO)тогда он больше не блокируется, и предупреждение не верно, верно?
Ноломан
Хороший вопрос @noloman, потому что «по крайней мере» предполагает знание, которого нет у того, кто задает этот вопрос. Тем не менее, предупреждение не исчезает, когда вы вводите эту обертку.
Алекс
14

Вы также получаете это предупреждение при вызове функции приостановки, которая @Throws(IOException::class)помечена (Kotlin 1.3.61). Не уверен, предназначено ли это или нет. В любом случае, вы можете исправить это предупреждение, удалив эту аннотацию или изменив ее на Exceptionкласс.

отметка
источник
Давайте назовем это подавлением, а не исправлением :) Полагаю, статический анализатор выделяет это, потому что метод, который выбрасывает IOException, обычно блокируется и требует некоторого драгоценного времени для завершения.
Иван Шафран
Я нашел это объяснение о IOException полезным: обсуждения.kotlinlang.org/t/…
Иван Шафран