2017-05-03 8 views
2

私は、ブルートゥース(BLE)で高速データを受信するAndroidアプリを持っています。データは、リモートセンサーデバイスからAndroidスマートフォンの専用サービス(Nordic nRF BLEマネージャー)に50〜100 Hzで到着します。データをフル・レートで別のサービスに渡して分析を実行したいと考えています。アナリティクスにIntentServiceを使用すると、10ミリ秒ごとにインテントが来ることになります。私は各インテントにかなりのオーバーヘッドがあると確信しており、このデータのために設計されたのかどうかは疑問です。しかし、私が読んだすべては、これが最も簡単な解決策であることを示唆しています。これは正しいアプローチですか?ありがとう。Android:IntentServiceを使用した高速データ

+0

センサーのデータは、Android端末のセンサーからのリモートデバイスからのものであり、* not *であることに注意してください。ちょうどそれをクリアしたかった。 – Hephaestus

答えて

1

まず、リアルタイム動作が必要かどうかを判断する必要があります。データはリアルタイムでBLEを介して受信されていますが、本当にリアルタイムで処理する必要がありますか?計算している分析がリアルタイムで必要ない場合は、データを受信して​​保存し、後で処理することは問題ありません。

実際にリアルタイムデータ処理が必要な場合は、IntentServiceは適切な設計の選択肢ではありません。

リアルタイムデータ処理が不要な場合は、IntentServiceが動作しますが、パフォーマンスの観点からは最適ではありません。

2つのオーバーヘッドがあります。

あなたが最初に見つけたのは、OSがインテントをサービスにルーティングする必要があるためです。

第2のものはIntentServiceの開始と停止に関連付けられます。インテント到着間の時間間隔がonHandleIntent()に戻る時間よりも遅い場合、システムはそれぞれのインテントについてIntentServiceを開始および停止します。このオーバーヘッドは、最初のオーバーヘッドよりもはるかに高いです。

したがって、この状況ではIntentServiceが動作しても、この方法を使用しないでください。

この問題の最良の解決方法は、バインドされたServiceを使用することです。 BLE受信者からバインドし、通常のメソッド呼び出しを使用してデータを送信します。欠点は、あなたが自分で二つの特徴を実装する必要がありますということです:バックグラウンドスレッド

これを書くに処理をオフロードする

  • ロジックを処理する必要のあるデータのキューをブロック

    1. ロジックは自明ではありませんが、アプリケーションが重大なプロジェクトであれば、IMHOを実行するのは唯一正しいことです。スレッドコードをコピーしてソースコードIntentServiceから貼り付けることができます。

      1語の注意::過剰なメモリ消費に注意する必要があります。たとえば、処理に単一のバックグラウンドスレッドを使用し、受信データのレートが処理レートより高い場合、キューは絶えず増加します。このような状況では、十分な時間が与えられれば、アプリケーションはOutOfMemory例外でクラッシュします(IntentServiceでも起こります)。

      この問題が発生した場合、あなたはのいずれかを実行する必要があります:SQLiteのにバックグラウンド処理のための

      1. 使用する複数のスレッド
      2. ストアデータを(が、その後のSQLiteが過剰に成長することができます)
      3. は、いくつかのデータをドロップ
  • +2

    HandlerThreadがあります.Looperにメッセージのキューがあり、すべての作業をバックグラウンドで行います。 –

    +0

    偉大な答えです。私はバインドされたサービスを使用することを考えていましたが、キューイングの問題は考慮していませんでした。仕事はリアルタイムではありません。サンプルは高速ですが、分析は2番目ほどに計算されます。しかし、私はサンプルを落とすことはできません。 – Hephaestus

    +0

    これについて考えてみると、できるだけ早くバッファにデータを書き込み(オーバーヘッドはほとんどありません)、アナリティクスを別のスレッドにフォークして、メインUIスレッドがバックアップとドロップを行わないようにしますサンプル。 – Hephaestus

    1

    IntentServiceにはインテントインテントのキューが埋め込まれているため、インテントが到着するより遅いインテントを処理すると、実行できます。 しかし、HandlerThreadを使用して、Message内の受信データをその上に投稿します。これにはメッセージキューも組み込まれていますが、IntentServiceの作成と同様にオーバーヘッドはありません。 もう1つのアプローチ - 通常のサービスを使用し、RxJavaライブラリで背圧を処理します。

    +0

    また、LocalBinderでBound Serviceを使用することも検討しています。これにより、BLEサービスは、アナリティクスサービスを直接呼び出してデータを配置することができます。 HandlerThreadも見ていきます。 – Hephaestus

    関連する問題