OkHttp中WebSocket的onFailure方法是否会自动关闭连接?
OkHttp WebSocket onFailure 方法是否自动关闭连接?
结论:OkHttp 不会在触发 onFailure 方法时自动关闭 WebSocket 连接,你需要手动执行关闭或取消操作
当 WebSocket 出现故障(如连接失败、通信错误等)触发 onFailure 时,OkHttp 仅负责通知你错误发生,不会主动关闭连接或释放底层资源。此时连接可能处于异常存活状态,若不手动处理,会存在资源泄漏的风险。
对你现有实现的分析与优化建议
你的手动关闭思路是正确的,但有几个细节可以调整:
super.onFailure(...)调用无实际意义,因为WebSocketListener的默认onFailure方法是空实现,没有任何逻辑。- 故障场景下,使用**1011(服务端异常)或1006(连接异常关闭)**这类错误状态码,比正常关闭的1000语义更准确。
cancel()的调用合理,当close()返回false时,说明连接已无法正常关闭,此时强制取消可以释放底层资源。- 自定义的
close()方法需确保完成本地资源清理(如取消订阅、释放关联对象等)。
优化后的示例代码:
@Override public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { // 用对应错误状态码关闭连接 boolean closedSuccessfully = webSocket.close(1011, "Connection failed: " + t.getMessage()); if (!closedSuccessfully) { webSocket.cancel(); // 清理本地资源 close(); } }
内容的提问来源于stack exchange,提问作者David Feldman
相关产品推荐
相关产品推荐

