1

Androidフォンから3台のBluetoothデバイスのステータスを監視したいアプリケーションがあります。このために、各デバイスにデータを送信し、5秒ごとに応答が正しいかどうかを確認する必要があります。そして、アプリケーションがフォアグラウンドにない場合でも、この処理を実行したいと思います。いろいろな解決策を考えましたが、良い解決策は思いつきませんでした。

  • IntentServiceを使うことを考えました。ただし、IntentServiceは、すべての処理を実行するために1つのスレッドを使用します。ただし、すべてのチェック間の5秒は短く、1つのスレッドでデバイスをチェックすることはできないため、3つの異なるスレッドが必要です。

  • 3つの異なるIntentServicesを使用することを考えました。しかし、それが最善の方法であるかどうかはわかりませんか?

  • サービスを使用して、デバイスごとに1つずつ、3つのスレッドを生成することを考えました。しかし、アプリがフォアグラウンドにないときにこれらのスレッドが実行されるかどうかはわかりませんでした。

    アプリがフォアグラウンドになく、3つの異なるスレッドを実行する必要がある場合でも、アプリでバックグラウンド処理を行うこの種のアプリを実行するための最良の設計は何でしょうか。

4

2 に答える 2

2

1 つのサービス、3 つのスレッドが必要です。単一のスレッドが複数のデバイスで I/O を実行することは、問題を要求しているように見え、不要な依存関係を作成します。アプリがフォアグラウンドかバックグラウンドかに関係なく、すべてのスレッドが実行されます。

Android フレームワークには、スレッドの実行を停止する方法がありません。スレッドの実行は Dalvik によって管理されます。フレームワークは、アプリのメイン スレッドがバックグラウンドにある場合 (BroadcastIntents などのイベントを除く)、イベントの配信を停止しますが、Dalvik にそのプロセスのすべてのスレッドを一時停止するようには指示しません。これは、バックグラウンド処理の目的を無効にするものです。

于 2011-07-20T17:11:22.077 に答える
0

必ずしも3つのスレッドは必要ありません。間違いなく3つのBluetoothSocketが必要です。onStartCommand()からスレッドを開始し、onDestroy()でスレッドを強制終了するサービスを1つ持つだけで、それを実行できる場合があります。スレッドはループして、各デバイスへのアクティブな接続があるかどうかを確認する必要があります。アクティブな接続がない場合は、再接続を試行する必要があります。接続が確立されると、プロトコルに従ってデバイスに書き込み、デバイスから読み取る必要があります。同じスレッド内の複数のデバイスへの書き込み/読み取りを妨げるものは何もありません。これにはノンブロッキングIOを使用して、反復ごとに読み取るバイトがあるかどうかを確認し、それらが見つかるまで確認してから、受け取った内容に基づいてアクションを実行できます。

ペアリング/ボンディングに関しては、デバイスをチェックするスレッドの外でそれを行います。ユーザーにピン/ペアリングを入力するように指示したい場合があるからです。3つのデバイスのそれぞれに対してバックグラウンドスレッドを読み取り/書き込みさせるだけです。複数のスレッドが必要な場合がありますが、それは純粋に好みの問題です...必要なスレッドは1つだけです。

于 2011-07-20T03:07:21.623 に答える