6

AIDL インターフェイスでリモート サービスを使用している Android IM アプリケーションに asmack を使用しています。

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 に答える