¿Cómo hacer que sea apropiada una "llamada de método de bloqueo inapropiado"?

29

Actualmente estoy tratando de aprovechar más las corotinas de Kotlin. Pero me enfrento a un problema: cuando uso moshi u okhttp dentro de estas corutinas recibo una advertencia:

"llamada de método de bloqueo inapropiado"

¿Cuál es la mejor manera de arreglar esto? Realmente no quiero ser inapropiado ;-)

ligi
fuente
Supongo que no quieres suprimir la advertencia, ¿verdad?
Saeed Entezari

Respuestas:

12

La advertencia trata sobre los métodos que bloquean el hilo actual y la rutina no puede suspenderse correctamente. De esta manera, perderá todos los beneficios de las rutinas y volverá a la calificación anterior a un trabajo por hilo.

Cada caso debe ser manejado de manera diferente. Para llamadas http suspendibles, puede usar el cliente ktor http . Pero a veces no hay una biblioteca para su caso, por lo que puede escribir su propia solución o ignorar esta advertencia.

Evgeny Bovykin
fuente
21
Ignorar la advertencia casi nunca es lo correcto, al menos puede ejecutar el código de bloqueo withContext(Dispatchers.IO).
Marko Topolnik
2
si ejecuta el código de withContext(Dispatchers.IO)bloqueo, ya no está bloqueando y la advertencia no es correcta, ¿verdad?
noloman
@noloman buena pregunta porque "al menos" supone saber que alguien que hace esta pregunta no tiene. Aún así, la advertencia no desaparece cuando introduce este contenedor.
Alex
14

También recibe esta advertencia cuando llama a una función de suspensión que está anotada con @Throws(IOException::class)(Kotlin 1.3.61). No estoy seguro si eso está destinado o no. De todos modos, puede corregir esta advertencia eliminando esa anotación o cambiándola a Exceptionclase.

marca
fuente
Digamos que suprime, no arregla :) Supongo que el analizador estático lo resalta porque el método que arroja IOException generalmente está bloqueando y toma un tiempo valioso para terminar.
Ivan Shafran
Encontré útil esta explicación sobre IOException: discusion.kotlinlang.org/t/…
Ivan Shafran