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
之外,并仅将那些可挂起的调用包装在它。
当我尝试在协程内建立 BT 连接时收到警告。
我检查过
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
之外,并仅将那些可挂起的调用包装在它。