Kotlin - "Inappropriate Block Method Call" 在协程中进行蓝牙连接时

Kotlin - "Inappropriate Block Method Call" when making Bluetooth Connection inside Coroutine

当我尝试在协程内建立 BT 连接时收到警告。

我检查过 ,但它只是抽象的理论,没有 material 代码。那里的一个答案提到标题中的警告应该在 case-by-case 基础上处理,所以这是我的情况。有谁知道我该如何解决警告?谢谢!

fun initSocket() = runBlocking {
    try {
        mSocket = // Assume socket is initialized correctly. Not relevant here
        mSocket.connect() // "Inapproprite Blocking Method Call"
        mOutputStream = mSocket.outputStream
    } catch (e: Exception) {
        Log.e(LOG_TAG, "Error establishing Socket Connection...")
    }
}

你是 运行 runBlocking 中的全部内容,blocks the thread 直到它完成。从它的外观来看,您是从主线程调用它,不允许进行阻塞调用 - 因此出现错误。

而不是 runBlocking,而是使用 Dispathers.IO 创建 suspend 函数,以卸载与 IO 线程的连接以避免阻塞主线程。

suspend fun initSocket() = withContext(Dispatchers.IO) { ... }

您的代码实际上不包含任何可挂起的函数调用。只需删除 runBlocking,您将拥有与现在相同的阻止行为。

如果您确实有一些可挂起的调用,您从您的示例中删除了 "irrelevant",那么您应该将阻塞调用移到 runBlocking 之外,并仅将那些可挂起的调用包装在它。