Jak ustawić „nieodpowiednie wywołanie metody blokowania”?

29

Obecnie próbuję bardziej wykorzystać kotlin coroutines. Ale mam problem: kiedy używam moshi lub okhttp w tych koronach, dostaję ostrzeżenie:

„nieodpowiednie wywołanie metody blokowania”

Jak najlepiej to naprawić? Naprawdę nie chcę być nieodpowiednia ;-)

ligi
źródło
Zakładam, że nie chcesz ukryć ostrzeżenia, prawda?
Saeed Entezari

Odpowiedzi:

12

Ostrzeżenie dotyczy metod, które blokują bieżący wątek i nie można poprawnie zawiesić coroutine. W ten sposób tracisz wszystkie zalety korupcji i ponownie obniżasz do jednego zadania na wątek.

Każda sprawa powinna być traktowana w inny sposób. Do zawieszanych połączeń http można użyć klienta ktor http . Ale czasami nie ma biblioteki dla twojej sprawy, więc możesz napisać własne rozwiązanie lub zignorować to ostrzeżenie.

Evgeny Bovykin
źródło
20
Ignorowanie ostrzeżenia prawie nigdy nie jest właściwe, możesz przynajmniej uruchomić kod blokujący withContext(Dispatchers.IO).
Marko Topolnik
2
jeśli uruchomisz kod blokujący withContext(Dispatchers.IO), to nie będzie już blokował, a ostrzeżenie nie będzie poprawne, prawda?
noloman
@noloman dobre pytanie, ponieważ „przynajmniej” zakłada wiedzę, której nie ma ktoś, kto zadaje to pytanie. Jednak ostrzeżenie nie zniknie po wprowadzeniu tego opakowania.
Alex
14

To ostrzeżenie pojawia się także podczas wywoływania funkcji wstrzymującej z adnotacją @Throws(IOException::class)(Kotlin 1.3.61). Nie jestem pewien, czy jest to zamierzone, czy nie. W każdym razie możesz naprawić to ostrzeżenie, usuwając adnotację lub zmieniając ją na Exceptionklasę.

znak
źródło
Nazwijmy to tłumieniem, a nie naprawianiem :) Podejrzewam, że analizator statyczny podkreśla to, ponieważ metoda, która wyrzuca wyjątek IOException, zwykle blokuje i zajmuje trochę cennego czasu.
Ivan Shafran
Uważam, że to wyjaśnienie dotyczące wyjątku
Ivan