Come rendere appropriata la "chiamata del metodo di blocco inappropriato"?


29

Attualmente sto cercando di sfruttare maggiormente le coroutine di kotlin. Ma devo affrontare un problema: quando uso moshi o okhttp all'interno di queste coroutine ricevo un avviso:

"chiamata di metodo di blocco inappropriata"

Qual è il modo migliore per risolverli? Davvero non voglio essere inappropriato ;-)


Presumo che tu non voglia sopprimere l'avvertimento, vero?
Saeed Entezari,

Risposte:


12

L'avvertimento riguarda i metodi che bloccano il thread corrente e il coroutine non possono essere correttamente sospesi. In questo modo, si perdono tutti i vantaggi delle coroutine e si esegue nuovamente il downgrade a un processo per thread.

Ogni caso dovrebbe essere gestito in modo diverso. Per le chiamate http sospendibili è possibile utilizzare il client http ktor . Ma a volte non esiste una libreria per il tuo caso, quindi puoi scrivere la tua soluzione o ignorare questo avviso.


21
Ignorare l'avviso non è quasi mai la cosa giusta, puoi almeno eseguire il codice di blocco withContext(Dispatchers.IO).
Marko Topolnik,

2
se esegui il codice di blocco con withContext(Dispatchers.IO)allora non sta più bloccando e l'avviso non è corretto, giusto?
Noloman,

@noloman buona domanda perché "almeno" assume la consapevolezza che qualcuno che sta ponendo questa domanda non ha. Tuttavia l'avviso non scompare quando si introduce questo wrapper.
Alex,

14

Questo avviso viene visualizzato anche quando si chiama una funzione di sospensione annotata con @Throws(IOException::class)(Kotlin 1.3.61). Non sono sicuro se ciò è previsto o meno. Ad ogni modo, puoi correggere questo avviso rimuovendo quell'annotazione o cambiandola in Exceptionclasse.


Chiamiamolo sopprimere, non correggere :) Suppongo che l'analizzatore statico lo evidenzi perché il metodo che genera IOException di solito sta bloccando e richiede del tempo prezioso per terminare.
Ivan Shafran

Ho trovato utile questa spiegazione su IOException: discuss.kotlinlang.org/t/…
Ivan Shafran
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.