我目前正在尝试更多地利用kotlin协程。但我面临一个问题:当在这些协程中使用moshi或okhttp时,我得到一个警告:

“不恰当的阻塞方法调用”

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


当前回答

如果你选择像一些答案建议的那样压抑,那就使用

@Suppress(“BlockingMethodInNonBlockingContext”)

其他回答

我使用Android Studio 4.1,当我使用Moshi或操作文件时,警告显示。即使我确定我在做什么,在withContext中包装代码也没有帮助。

我最近发现,将警告的小代码移动到标准方法中,而不像有趣的action(){…}可以删除警告。这很难看,因为它只是隐藏了警告。

更新:从我的个人经验来看,似乎抑制警告或runBlocking更直接。

如果你选择像一些答案建议的那样压抑,那就使用

@Suppress(“BlockingMethodInNonBlockingContext”)

使用withContext将“不适当的阻塞方法调用”代码包装到另一个上下文中。

也就是说(例如):

如果你正在执行一个读/写阻塞方法调用:

val objects = withContext(Dispatchers.IO) { dao.getAll() }

如果您正在执行阻塞网络请求(使用Retrofit):

val response = withContext(Dispatchers.IO) { call.execute() }

或者如果你正在执行一个CPU密集型的阻塞任务:

val sortedUsers = withContext(Dispatchers.Default) { users.sortByName() }

这将挂起当前的协程,然后在不同的线程上执行“不适当的阻塞调用”(来自Dispatchers)。IO或Dispatchers。(默认池),因此不会阻塞协程正在执行的线程。

我使用dispatchers作为启动参数:

    GlobalScope.launch(Dispatchers.IO) {
        // Do background work
        
        // Back to main thread
        launch(Dispatchers.Main) {
            Toast.makeText(context, "SUCCESS!", Toast.LENGTH_LONG)
                .show()
        }
    }

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