应用关闭后,我的Websocket客户端(OkHttp)没有关闭连接。每当我打开应用程序时,它都会打开一个新的连接,这会使该应用程序遭受到来自广播服务器的新旧Websocket连接上收到的多条消息的困扰。
对于Android客户端来说,这是我的正常行为,就像我在Web客户端上遇到的情况一样,在选项卡被杀死后,会话已正确关闭了吗?
我一直在互联网上查找问题,但到目前为止还没有运气。我想确定是由于我的错误代码逻辑还是因为库中Websocket的错误实现而发生了?
这是我在主活动中开始新的Websocket会话的方法
var request: Request = Request.Builder()
.url("ws://$serverIP:8080/example/sim/speed")
.build()
var webSocketListener: WebSocketListener = object : WebSocketListener() {
override fun callback(msg: Message) {
updateSpeed(msg.content)
}
override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {
super.onClosing(webSocket, code, reason)
}
}
var webSocket = client!!.newWebSocket(request, webSocketListener)
之后,updateSpeed()
将更新UIThread上的文本视图
应用程序关闭时,不会触发onClosed
事件,只有在手动调用close
函数时才会触发。
我确定每次都会打开一个新的套接字,因为我可以看到服务器上使用不同端口创建的新会话。
我想要的是让应用在关闭之前关闭其连接。
谢谢
答案 0 :(得分:1)
我也遇到了这个问题,在我的应用被杀死后,WebSocket仍然打开。
要解决此问题,我手动关闭套接字并删除所有空闲连接:
fun clear() {
webSocket?.close(1001, "Android: User exited the game.")
webSocket = null
subs.clear()
subs.add(Completable.fromAction {
client.connectionPool.evictAll()
}.subscribeOn(Schedulers.io()).subscribe({}, {}))
}
我基本上在活动(即活动)中调用clear()
,这可能会在应用终止时打开。
override fun onDestroy() {
super.onDestroy()
App.webSocketClient().clear()
}
这不是理想的解决方案,但每次都能奏效。