Wie kann ein "unangemessener Aufruf der Blockierungsmethode" angemessen gemacht werden?

29

Ich versuche derzeit, Kotlin-Coroutinen stärker zu nutzen. Aber ich habe ein Problem: Wenn ich Moshi oder Okhttp in diesen Coroutinen verwende, bekomme ich eine Warnung:

"unangemessener Aufruf der Blockierungsmethode"

Was ist der beste Weg, um diese zu beheben? Ich möchte wirklich nicht unangemessen sein ;-)

ligi
quelle
Ich nehme an, Sie möchten die Warnung nicht unterdrücken, oder?
Saeed Entezari

Antworten:

12

Die Warnung bezieht sich auf Methoden, die den aktuellen Thread blockieren und die Coroutine kann nicht ordnungsgemäß angehalten werden. Auf diese Weise verlieren Sie alle Vorteile von Coroutinen und führen erneut ein Downgrade auf einen Job pro Thread durch.

Jeder Fall sollte anders behandelt werden. Für suspendierbare http-Aufrufe können Sie den ktor http-Client verwenden . Manchmal gibt es jedoch keine Bibliothek für Ihren Fall, sodass Sie entweder Ihre eigene Lösung schreiben oder diese Warnung ignorieren können.

Evgeny Bovykin
quelle
20
Das Ignorieren der Warnung ist fast nie das Richtige. Sie können zumindest den Blockierungscode ausführen withContext(Dispatchers.IO).
Marko Topolnik
2
Wenn Sie den Blockierungscode mit ausführen withContext(Dispatchers.IO), wird er nicht mehr blockiert und die Warnung ist nicht korrekt, oder?
Noloman
@ Noloman gute Frage, weil "zumindest" Wissen voraussetzt, das jemand, der diese Frage stellt, nicht hat. Die Warnung verschwindet jedoch nicht, wenn Sie diesen Wrapper einführen.
Alex
14

Diese Warnung erhalten Sie auch, wenn Sie eine Suspendierungsfunktion aufrufen, die mit @Throws(IOException::class)(Kotlin 1.3.61) versehen ist. Ich bin mir nicht sicher, ob das beabsichtigt ist oder nicht. Auf jeden Fall können Sie diese Warnung beheben, indem Sie diese Anmerkung entfernen oder in ExceptionKlasse ändern .

Kennzeichen
quelle
Nennen wir es unterdrücken, nicht reparieren :) Ich nehme an, der statische Analysator hebt es hervor, weil die Methode, die IOException auslöst, normalerweise blockiert und einige wertvolle Zeit in Anspruch nimmt, um fertig zu werden.
Ivan Shafran
Ich fand diese Erklärung zu IOException hilfreich: Diskussion.kotlinlang.org/t/…
Ivan Shafran