本文介绍 RTM SDK 与 RTM 服务之间的连接状态以及连接状态如何在不同状态之间切换。
概述
网络连接状态指的是 RTM SDK 与 RTM 服务之间的连接状态,分别有:
| 连接状态 | 说明 | 
|---|---|
CONNECTION_STATE_DISCONNECTED | 用户未连接 | 
CONNECTION_STATE_CONNECTING | 用户正在连接 | 
CONNECTION_STATE_CONNECTED | 用户已连接 | 
CONNECTION_STATE_RECONNECTING | 用户正在重连 | 
CONNECTION_STATE_ABORTED | 用户被踢出 | 
网络连接状态的改变可以调用 API 主动改变,RTM SDK 也会根据网络等条件自动实现部分状态切换。
当连接状态发生改变时,RTM SDK 会通过 onConnectionStateChanged 回调返回最新的连接状态 ConnectionState 的枚举值 和 状态变化的原因 ConnectionChangeReason 的枚举值。
调用 API 改变连接状态
主动调用 API 方法改变网络连接状态的有:login 和 logout。
1. 登录 RTM 系统
当使用 RtmClient 调用 login 登录 RTM 系统时,连接状态会从 DISCONNECTED 变为 CONNECTING,状态改变原因为 LOGIN。
当处于 CONNECTING 状态时,你不需要进行任何操作,连接状态会自动转换为下列状态之一:
DISCONNECTED:用户登录失败或登录超时(6 秒内未登录系统)。CONNECTED:用户登录成功。 当连接状态变为DISCONNECTED后,你需要重新调用 login 登录。
2. 登出 RTM 系统
当使用 RtmClient 调用 logout 登出 RTM 系统,连接状态会转换为 DISCONNECTED。
根据条件自动改变连接状态
根据条件自动改变网络连接状态的有:断网重连和被踢出系统。
1. 断网重连
当连接处于 CONNECTED 状态时,由于网络等原因导致 RtmClient 与 RTM 系统连接断开时长超过 4 秒,连接状态会由 CONNECTED 改变为 RECONNECTING,状态改变原因为 INTERRUPTED。RTM SDK 会持续自动重新登录 RTM 系统直至登录成功,应用端无需处理,重新登录成功后,连接状态会变更为 CONNECTED。
自动重连之后,RTM SDK 会把断开连接期间的消息进行补发:
- 断开连接期间的全部点对点消息。
 - 补发重连成功之前 30 秒内的频道消息。
 - 最多补发 32 条频道消息。
 
处于重连状态时,根据实际业务情况可以调用 logout 登出系统再调用 login 方法重新登录 RTM 系统。
注意事项:
- 30 秒内重连成功,连接状态会变更为 
CONNECTED。用户的在线状态不变。 - 30 秒内仍然未重连成功,RTM 系统会将对应用户从在线用户列表和频道中移除,同一频道的用户会收到 
MemberLeft回调。如果用户在之后重新成功登录系统,连接状态会变更为CONNECTED,SDK 会自动帮助对应用户加入之前加入的频道,同一频道的用户会收到MemberJoined回调。由于此时 RTM 系统已将用户从在线列表中移除, SDK 还会自动同步用户属性到 RTM 系统。 - SDK 重连时,如果 Token 过期,SDK 会返回 
TokenExpired回调。但是该回调不会对连接状态产生影响。 
2. 被踢出 RTM 系统
RTM 系统不支持多点登录,如果使用相同的用户 ID 登录 RTM 系统,当前登录状态的用户会被 RTM 系统踢出,连接状态变为 ABORTED。
你可以调用 logout 先登出系统再根据实际业务情况调用 login 方法重新登录 RTM 系统。
在 ABORTED 状态下,调用publish等需要校验用户权限的 API 都会失败。
示例代码
参考以下示例代码监听连接状态:
// 监听连接状态
public void onConnectionStateChanged(int state, int reason)
{
   System.out.println("on connection state changed to "+ state + " reason: " + reason);
 }

