目前通过 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
1
bmwh123 346 天前
有的国产安卓系统,会禁止长时间运行的应用 service,可能需要把你测试的 app 的安全设置或者自启管理之类的设置一下,还有就是可以使用两个服务互相调用的方式去保活
|
2
NessajCN 346 天前 via Android
每次从冻结回来肯定要 new 个新 socket client 对象啊,哪能还用之前那个
|
3
henyi2211 346 天前
断线自动尝试重连。
如果有状态数据要恢复,就加入会话机制;初次建立连接的时候,服务端发送会话 token 给客户端保存;重连时,尝试使用会话 token 恢复状态 |
4
tool2d 346 天前
手机锁屏 websocket 不是常规状态嘛,客户端重连一下就可以了啊。
|
6
JackCh3ng 346 天前
app 电池管理选择不优化,然后锁定后台。
一般像你这种需求是要上消息推送服务的。 |
7
okakuyang 346 天前 via iPhone
这就是安卓后台保活吧,我觉得基本无解。可以看看是不是省电模式或者手机优化程序干的。
|
8
JackCh3ng 346 天前
现在的安卓系统对于应用后台长期存在的 service 会在通知中心显式的提醒用户,这应该是安卓的隐私保护策略。然后还有个电池优化管理,会清掉后台不用的 app ,这会导致 app 的一些功能异常。我不是专业的安卓开发,这些是我之前写一个计时器 app 时遇到的问题,我是通过电池优化管理选择不优化来解决的。
|
9
coderxy 346 天前
保活别想了,老老实实做好重连就行了。
|
12
lty81372860 346 天前
IM 应用就接各大手机厂的官方推送服务吧,国内各家魔改的系统对于微信这种大体量应用是有白名单的,当然也不对外开放,所以想达到效果就接推送好了。
|
13
lty81372860 346 天前
实际你可以了解下商用的那些 IM SDK 是怎么保证效果的,最后殊途同归,都是调官方推送服务+调优过的长连接策略
|
14
gowas 346 天前
整个错误抑制 要有断线重连
|
15
lty81372860 346 天前
之前微信技术团队分享过一个他们对于长连接的调优文章,具体可以去他们公众号搜搜。
|
16
babyrjw 346 天前
感觉部分网络的 NAT 会不定期淘汰 NAT 表,淘汰后这 socket 就没用了,关键是 tcp 的中断检测也麻烦,发一条数据等超时才知道断开。 我以前遇到过在某一次心跳之后服务器发送数据到客户端失败,两边抓包发现客户端和服务器都会偶发性该问题,切换网络就正常
|
17
xiaoming61 346 天前 via Android
断线重连必须要有,光有前台服务不够。一些国产系统会在应用后台时禁止联网。
|
18
weeei 346 天前
退到后台就主动关闭长连接。切到前台重新连接。后台接收消息主要靠系统级别的推送。
|
19
ifbluethen 345 天前
前司用 uniapp 开发 MQTT 应用也是这个问题,最后只能销毁原有的,再新建重连。
|
20
hez2010 345 天前
开发即时通讯的推送消息难道不应该走平台的统一推送吗。。
Google 服务虽然被墙了但是 FCM 可没有被墙。 |