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.