2

TCP ソケット接続を使用するクライアント サーバー アプリケーションを作成しています。私の Android プロジェクトでは、Service は TCP ソケットをリッスンするためのスレッドを作成します。

すべて問題ないようです。しかし、問題が 1 つあります。ネットワーク サービスがバックグラウンドで正常に実行されています。しかし、しばらくしてから (10 ~ 15 分 ..)、アプリケーション (メイン アクティビティ) を再度開こうとすると、ソケット接続から応答を取得できません。フリーズか何か??ソケットから TCP メッセージを送信または取得できません。これは何が原因でしょうか? 3G接続を介して、電話で作業しています。

(また、エミュレータで実行されているアプリにはこのような問題はありません。接続は安定しており、長時間使用できると思います)

ご回答ありがとうございます。

4

3 に答える 3

1

電力の最適化と、おそらく接続 (GPRS/HSDPA/Wifi) の変更により、接続が切断されている可能性が非常に高くなります。

接続を維持するには、バックグラウンド サービスが PowerManager クラスを使用してウェイクロックを要求する必要があります。これにより、デバイスが省電力モードになり、ソケットが切断されるのを防ぎます。ただし、これによりデバイスのバッテリー寿命が大幅に低下することに注意してください。

また、開いている接続を切断する接続の変更を処理する必要があります。Android は、 android.net.conn.CONNECTIVITY_CHANGEという名前のブロードキャスト メッセージを送信して、接続の変更を通知します。

ユースケースに応じて、デバイスがスリープモードのときにポーリングし、デバイスがアクティブに使用されているときにのみ接続を構築するか、C2DM プッシュ通知を使用するだけです

于 2012-05-24T21:16:31.043 に答える
0

定期的にデータを送信していますか?ハートビート プロトコルの実装が好きですか? そうでない場合は、そうする必要があります...または、ソケットのREAD/WRITE TIMEOUTに関係している可能性があります

于 2012-05-24T21:35:22.603 に答える
0

アプリでこのようなことを経験したとき、それは通常、電話での電力の最適化が原因でした (これはオーバーライドできません)。ソケットのアイドル状態が長すぎると、ソケットは自動的に閉じられ、再度開く必要があります。

于 2012-05-24T19:31:21.187 に答える