2

Androidチャットアプリケーションを作成しました。を使用して接続されているTCPサーバーがありますSocket

サーバー接続を常にバックグラウンドで機能させ(アプリがフォアグラウンドにない場合でも)、サーバーから送信されたデータをリッスンしたいと思います。

今のところ、whileループを使用して何か新しいものがあるかどうかを確認していますが、Androidがリソースを必要とする場合、OSはスレッドを閉じます。

ブロッキングメソッドであるため、ループreadline()を使用する代わりにスレッドでメソッドを使用することを考えました。whilereadline()

これは、OSがアプリケーションを強制終了するのを防ぐための正しいアプローチですか?

着信ソケットが利用可能な場合にのみ起動するカスタムブロードキャストレシーバーのような方法はありますか?

ありがとう!

4

1 に答える 1

1

つまり、Androidは、実行を継続するためにリソースを占有するすべてのアプリケーションを強制終了できます。アプリが強制終了される恐れのあるシナリオを処理する方法について、責任があります。

開発者のサイトにあるサービスのライフサイクルを確認することをお勧めします。

まず、サービスやアクティビティを問わず、このように大量に動作するアプリケーションは、Androidの観点からは「失礼」と見なされるため、この方法で強制終了する準備ができています。

たとえば、onLowMemoryオーバーライドメソッドをリッスンし、それに応じてデータの保存や注意事項などを実行します。

実際に発生するはずのことは、このサービスがスレッドを生成して、この方法で着信接続を定期的にリッスンすることです。

while (!terminating){
     Socket incomingClientSocket = ourServerSocket.accept();
     // How you handle this part is up to you?
     Thread.sleep(500); // Sleep for 500 ms
}

terminating変数はaであり、booleanループをいつ終了するかを制御する決定変数です。メソッドがどのように使用されているかに注意してくださいThread.sleep。実行を「落ち着かせる」ために、省略された場合、Androidはアプリに十字線を付けて終了します。つまり、システムリソースに対して礼儀正しくなります。

ヒント:クラスを拡張しメソッドThreadを介して着信接続を処理する機能を保持しますaccept()

がnull以外にincomingClientSocketなると、別のスレッドが作成され、の入力/出力ストリームが開かれ、バイナリincomingClientSocket方式を使用して読み取り/書き込みが行われます。

この方法は設計が不十分であることを示しており、データがテキスト形式であると想定して使用しないでくださいreadline。たとえば、クライアントへの1つの着信パケットは720バイトであり、その後に着信する次のパケットは564バイトである可能性があります。それがTCP/IPの性質です。

開始マーカーと終了マーカーなど、データ送信の境界を確立するためのより信頼性の高い方法を考え出す必要があります。サーバーに着信データを読み取らせ、開始マーカーと終了マーカーで構成されるバイトストリームを一度に区別させます。両方が存在し、マーカー間の実際のデータを抽出し、それに応じて動作します。

たとえば、incomingClientSocketそれが実際にnullでなくなったときに、アクティビティにブロードキャストを送信してそれに基づいて動作させ、アクティビティを許可し、そのソケットを取得して、接続を開き、入出力との間で読み取り/書き込みを行うことができます。ソケットに関連付けられたストリーム。

于 2012-09-22T23:21:17.217 に答える