Como tornar apropriada a "chamada de método de bloqueio inadequado"?

29

Atualmente, estou tentando aproveitar mais as corotinas da kotlin. Mas enfrento um problema: ao usar moshi ou okhttp dentro dessas corotinas, recebo um aviso:

"chamada de método de bloqueio inadequado"

Qual é a melhor maneira de corrigir isso? Eu realmente não quero ser inapropriado ;-)

ligi
fonte
Eu suponho que você não quer suprimir o aviso, não é?
Saeed Entezari #

Respostas:

12

O aviso é sobre métodos que bloqueiam o encadeamento atual e a corotina não pode ser adequadamente suspensa. Dessa forma, você perde todos os benefícios das corotinas e faz o downgrade para um trabalho por thread novamente.

Cada caso deve ser tratado de uma maneira diferente. Para chamadas http suspensíveis, você pode usar o cliente http ktor . Mas, às vezes, não há biblioteca para o seu caso, portanto, você pode escrever sua própria solução ou ignorar esse aviso.

Evgeny Bovykin
fonte
20
Ignorar o aviso quase nunca é a coisa certa, você pode pelo menos executar o código de bloqueio withContext(Dispatchers.IO).
Marko Topolnik 27/11/19
2
se você executar o código de bloqueio withContext(Dispatchers.IO), ele não estará mais bloqueando e o aviso não está correto, certo?
noloman 10/01
@noloman boa pergunta porque "pelo menos" pressupõe conhecimento de que alguém que está fazendo essa pergunta não tenha. Ainda assim, o aviso não desaparece quando você apresenta esse wrapper.
Alex
14

Você também recebe esse aviso ao chamar uma função de suspensão anotada com @Throws(IOException::class)(Kotlin 1.3.61). Não tenho certeza se isso é intencional ou não. De qualquer forma, você pode corrigir esse aviso removendo a anotação ou alterando-a para Exceptionclasse.

Marca
fonte
Vamos chamá-lo de suprimir, não consertar :) Suponho que o analisador estático o destaque porque o método que lança o IOException geralmente está bloqueando e leva algum tempo valioso para concluir.
Ivan Shafran
Achei útil esta explicação sobre o IOException: discuss.kotlinlang.org/t/…
Ivan Shafran