2012-08-15 21 views
6

私はアンドロイドIMアプリケーションのためにasmackを使用しています。ここで私はAIDLインターフェイスを使ってリモートサービスを使用しています。アンドロイドサービスでキープアライブ接続を処理する方法

私のサービスの方法onStartCommandの中に私は以下のようにコードを書く。私は接続を作成し、それを使ってログインします。誰かが私のアプリケーションを実行するときonCreate私のアプリケーションの主な活動の方法私のサービスを実行getApplicationContext.StartService(serviceIntent)。それは問題なく動作していますが、数分後(時には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("[email protected]", "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; 
    } 
} 

ご案内してください。

+0

コードを書式設定し、投稿に適したタイトルを選択してください。 – Flow

+0

問題は私の接続が存在しますが、パケットを聴くことができません。その接続を使用してsendPacketを呼び出すことはできますが、なぜそれが着信パケットを待ち受けるのか分からないのです。私はsendPacketをメッセージパケットを送信するサービス、ご案内ください。 私は以下のリンクに掲載されているのと同じ問題に直面しています。 http://stackoverflow.com/questions/5040852/packet-listener-in-android-service – aftab

+0

あなたの投稿されたリンクは答えられているようです----> http://stackoverflow.com/questions/5040852/packet-listener -in-android-service – sascha10000

答えて

4

気付かずに接続が切断されていませんか? 接続状態をデバッグするには、各コールバックごとに接続リスナーとログを追加する必要があります。

「ゾンビ」ソケットがある可能性があります:あなたはまだそれに書き込むことができますが、受信者はメッセージを受け取ることはありません。もちろん、そこから新しいメッセージを読むことはできません。 これはネットワークの状態が変更された後に発生します。

私がXMPP Pingを使用していることを検出するには、アラームからクライアントから開始します(不正確な繰り返しで15分ごとに開始します)。そして私は空白を止めておく。 これは、クライアントとサーバー(NATまたはプロキシ)の間に存在する可能性のあるタイムアウトメカニズムのほとんどを無効にします。 さらに、ping(たとえば20秒以内)に応答がない場合は、接続状態が悪いとみなして手動で再接続できます。

+0

親愛なるGuillaume Perrot:お返事ありがとうございます。私は奇妙な問題に直面している。私はキープアライブ接続を処理するためにAIDLサービスを使用しています。私はうまく動作しているメッセージを送受信しています。しかし、XMPPオブジェクトを使用して、私はサブスクリプション招待リクエストをユーザに送信し、リクエストパケットをうまく送信します。しかし、ここで問題となるのは、着信パケットを待ち受けるためにパケットリスナーが停止することです。同じ時刻に、同じxmppオブジェクトを使ってパケットを送信しようとしましたが、受信したパケットを聞くために受信を停止しました。それはxmppパケットリスナーが招待状を送信した後に邪魔になります。ご案内ください。 。 – aftab

+0

AndroidDebuggerクラス(通常のSmackのConsoleDebugger)を使用して、PacketListener APIを使用せずにソケット上で実際に読み取られたり書き込まれたものを印刷することができます。リスナーの動作が停止したときに、デバッガのログにパケットを受信するかどうかを確認する必要があります。 –

関連する問題