我目前正在尝试更多地利用kotlin协程。但我面临一个问题:当在这些协程中使用moshi或okhttp时,我得到一个警告:
“不恰当的阻塞方法调用”
解决这些问题的最好方法是什么?我真的不想不合适;-)
我目前正在尝试更多地利用kotlin协程。但我面临一个问题:当在这些协程中使用moshi或okhttp时,我得到一个警告:
“不恰当的阻塞方法调用”
解决这些问题的最好方法是什么?我真的不想不合适;-)
当前回答
当调用带有@Throws(IOException::class)注释的挂起函数(Kotlin 1.3.61)时,也会收到此警告。不确定这是否是有意为之。无论如何,您可以通过删除该注释或将其更改为Exception类来抑制此警告。
其他回答
一个解决方案是通过挂起有趣的kotlinx. corroutine . runinterruptible来包装阻塞代码。 如果没有它,当协程的任务被取消时,阻塞代码将不会中断。
它抑制了编译警告,阻塞代码将在取消时抛出InterruptedException
val job = launch {
runInterruptible(Dispatchers.IO) {
Thread.sleep(500) // example blocking code
}
}
job.cancelAndJoin() // Cause will be 'java.lang.InterruptedException'
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-interruptible.html
如何将Java阻塞函数转换为可取消的挂起函数?
我使用Android Studio 4.1,当我使用Moshi或操作文件时,警告显示。即使我确定我在做什么,在withContext中包装代码也没有帮助。
我最近发现,将警告的小代码移动到标准方法中,而不像有趣的action(){…}可以删除警告。这很难看,因为它只是隐藏了警告。
更新:从我的个人经验来看,似乎抑制警告或runBlocking更直接。
如果你选择像一些答案建议的那样压抑,那就使用
@Suppress(“BlockingMethodInNonBlockingContext”)
它看起来像在kotlin.runCatching()中封装调用解决了警告,但不确定为什么…因为正如之前关于runCatching的回答所说,这不是由于抛出异常,因为即使try{} catch也不能解决问题,可能是一些错误检测问题… 我现在使用了下面的方法……
val result = kotlin.runCatching {
OldJavaLib.blockingCallThatThrowsAnException()
}
if (result.isSuccess) {
print("success is on your side")
} else {
print("one failure is never the end")
}
当调用带有@Throws(IOException::class)注释的挂起函数(Kotlin 1.3.61)时,也会收到此警告。不确定这是否是有意为之。无论如何,您可以通过删除该注释或将其更改为Exception类来抑制此警告。