6

我正在将 asmack 用于 android IM 应用程序,我在其中使用具有 AIDL 接口的远程服务。

onStartCommand我的服务方法中,我编写如下代码。我创建连接,然后使用它登录。当任何人在我的应用程序onCreate的主要活动方法中运行我的应用程序时,运行我的服务getApplicationContext.StartService(serviceIntent)。它工作正常,但几分钟(有时 10 分钟,有时超过 10 分钟)后messageListener,我附加在服务内部停止接收消息。但我知道连接存在,因为在我xmppConnection用来发送消息的同时,它正在向用户 B 发送消息,但它没有收听来自用户 B 的消息。我不知道为什么我的听众停止收听消息。

public int onStartCommand(final Intent intent, final int flags, final int startId) {
    ConnectionConfiguration config = new ConnectionConfiguration(URL, MyPort, Host);
    xmppConnection = new XMPPConnection(config);
    xmppConnection.connect();
    xmppConnection.login("someid@sample.com", "testpass");
    xmppConnection.addPacketListener(myMessageListener, new PacketTypeFilter(Message.class));
    return START_STICKY;
}
private PacketListener myMessageListener = new PacketListener() {
    public void processPacket(Packet packet) {
        Message msg = (Message) packet;
    }
}

请指导。

4

1 回答 1

4

您的连接是否在您不注意的情况下因错误而关闭?您应该为每个回调添加一个连接侦听器和一个日志以调试连接状态。

在 Android 上,可能会有一个“僵尸”套接字:您仍然可以对其进行写入,但接收者将永远不会收到消息,当然您将无法从中读取新消息。它可能在网络状态更改后发生。

为了检测我使用XMPP Ping,从客户端从警报启动(每 15 分钟不精确重复)。我禁用了空白保持活动。这会破坏客户端和服务器(NAT 或代理)之间可能存在的大多数超时机制。另外,如果您没有收到任何对 ping 的答复(例如,在 20 秒内),您可以假设连接处于错误状态并手动重新连接。

于 2012-08-20T13:28:41.803 回答