[有偿] 原生 app 开发即时通讯 关于 websocket 长链接的问题

查看 148|回复 11
作者:rcj6056   
目前通过 httpclien.webSocketClient 来实现 websocket 的建链
通过 DefaultClientWebSocketSession 来接受服务端推送的消息 session.incoming.receive()
目前问题是
当 app 退出到后台 锁屏一段时间之后 app 被冻结了 再次打开 app 就会出现
Exception: java.net.SocketTimeoutException: timeout
Exception: kotlinx.coroutines.channels.ClosedReceiveChannelException: Channel was closed
类似的异常
想请问这种情况怎么处理
ps 提供思路并解决的老哥有红包感谢:D

App, WebSocket, Exception, Closed

bmwh123   
有的国产安卓系统,会禁止长时间运行的应用 service,可能需要把你测试的 app 的安全设置或者自启管理之类的设置一下,还有就是可以使用两个服务互相调用的方式去保活
NessajCN   
每次从冻结回来肯定要 new 个新 socket client 对象啊,哪能还用之前那个
henyi2211   
断线自动尝试重连。
如果有状态数据要恢复,就加入会话机制;初次建立连接的时候,服务端发送会话 token 给客户端保存;重连时,尝试使用会话 token 恢复状态
tool2d   
手机锁屏 websocket 不是常规状态嘛,客户端重连一下就可以了啊。
rcj6056
OP
  
@bmwh123 项目启动了一个前台进程 在通知栏会有一个小图标 表示 app 还存活着
但是停留后台超过一定时间就会报 socket 的异常
JackCh3ng   
app 电池管理选择不优化,然后锁定后台。
一般像你这种需求是要上消息推送服务的。
okakuyang   
这就是安卓后台保活吧,我觉得基本无解。可以看看是不是省电模式或者手机优化程序干的。
JackCh3ng   
现在的安卓系统对于应用后台长期存在的 service 会在通知中心显式的提醒用户,这应该是安卓的隐私保护策略。然后还有个电池优化管理,会清掉后台不用的 app ,这会导致 app 的一些功能异常。我不是专业的安卓开发,这些是我之前写一个计时器 app 时遇到的问题,我是通过电池优化管理选择不优化来解决的。
coderxy   
保活别想了,老老实实做好重连就行了。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部