如何解决IDEA中suspend函数调用InetAddress.getByName报不当阻塞方法调用问题
问题原因
协程规范要求挂起函数不能直接调用阻塞方法,避免阻塞协程调度线程。
InetAddress.getByName()属于阻塞式域名解析方法,会在等待解析结果时卡住当前线程,因此IDEA会触发不适当阻塞调用的警告。
解决方案
将阻塞调用逻辑放到IO调度器中执行,用withContext包裹即可,修改后代码如下:
private suspend fun sendHandshakeAnswer(websocket: DefaultWebSocketServerSession): SocketSession? { val remoteAddress = withContext(Dispatchers.IO) { InetAddress.getByName(websocket.call.request.origin.remoteHost) } val dbSession = SessionManager.startSession( user, remoteAddress, fingerprint, videocard ) // 原有后续逻辑保持不变 }
补充说明
withContext(Dispatchers.IO)会自动将阻塞逻辑调度到专门处理IO任务的线程池执行,不会阻塞当前协程的调度线程,执行完成后自动切回原调度器上下文,IDEA的警告也会自动消失- 如果你的项目里有自定义的IO调度器,也可以替换默认的
Dispatchers.IO使用
内容的提问来源于stack exchange,提问作者Алина Чебакова
相关产品推荐
相关产品推荐

