如何使“不合适的阻塞方法调用”合适?


29

我目前正在尝试进一步利用Kotlin协程。但是我遇到一个问题:在这些协程中使用moshi或okhttp时,我得到一个警告:

“不合适的阻塞方法调用”

解决这些问题的最佳方法是什么?我真的不想被不合适;-)


我假设您不想抑制警告,对吗?
赛义德·恩特萨里

Answers:


12

警告是关于阻止当前线程和协程无法正确挂起的方法。这样,您将失去协程的所有优势,并再次降级为每个线程一项任务。

每种情况应以不同的方式处理。对于可挂起的http调用,可以使用ktor http client。但是有时您的案例没有库,因此您可以编写自己的解决方案或忽略此警告。


20
忽略警告几乎永远不是正确的选择,您至少可以在中运行阻塞代码withContext(Dispatchers.IO)
Marko Topolnik,

2
如果您运行带有的阻止代码,withContext(Dispatchers.IO)则它不再受阻止,并且警告不正确,对吗?
noloman

@noloman是个好问题,因为“至少”假设有人问这个问题没有。当您引入此包装器时,警告仍不会消失。
亚历克斯

14

当调用带有@Throws(IOException::class)(Kotlin 1.3.61)注释的挂起函数时,也会收到此警告。不知道这是否是故意的。无论如何,您可以通过删除该注释或将其更改为class 来解决此警告Exception


我们称其为抑制,而不是固定:)我想,静态分析器会突出显示它,因为引发IOException的方法通常会阻塞并且需要花费一些宝贵的时间才能完成。
伊凡·夏弗兰

:我发现这个解释有关IOException异常有用discuss.kotlinlang.org/t/...
伊万沙弗兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.