私は、ブルートゥース(BLE)で高速データを受信するAndroidアプリを持っています。データは、リモートセンサーデバイスからAndroidスマートフォンの専用サービス(Nordic nRF BLEマネージャー)に50〜100 Hzで到着します。データをフル・レートで別のサービスに渡して分析を実行したいと考えています。アナリティクスにIntentServiceを使用すると、10ミリ秒ごとにインテントが来ることになります。私は各インテントにかなりのオーバーヘッドがあると確信しており、このデータのために設計されたのかどうかは疑問です。しかし、私が読んだすべては、これが最も簡単な解決策であることを示唆しています。これは正しいアプローチですか?ありがとう。Android:IntentServiceを使用した高速データ
答えて
まず、リアルタイム動作が必要かどうかを判断する必要があります。データはリアルタイムでBLEを介して受信されていますが、本当にリアルタイムで処理する必要がありますか?計算している分析がリアルタイムで必要ない場合は、データを受信して保存し、後で処理することは問題ありません。
実際にリアルタイムデータ処理が必要な場合は、IntentService
は適切な設計の選択肢ではありません。
リアルタイムデータ処理が不要な場合は、IntentService
が動作しますが、パフォーマンスの観点からは最適ではありません。
2つのオーバーヘッドがあります。
あなたが最初に見つけたのは、OSがインテントをサービスにルーティングする必要があるためです。
第2のものはIntentService
の開始と停止に関連付けられます。インテント到着間の時間間隔がonHandleIntent()
に戻る時間よりも遅い場合、システムはそれぞれのインテントについてIntentService
を開始および停止します。このオーバーヘッドは、最初のオーバーヘッドよりもはるかに高いです。
したがって、この状況ではIntentService
が動作しても、この方法を使用しないでください。
この問題の最良の解決方法は、バインドされたService
を使用することです。 BLE受信者からバインドし、通常のメソッド呼び出しを使用してデータを送信します。欠点は、あなたが自分で二つの特徴を実装する必要がありますということです:バックグラウンドスレッド
これを書くに処理をオフロードする
- ロジックは自明ではありませんが、アプリケーションが重大なプロジェクトであれば、IMHOを実行するのは唯一正しいことです。スレッドコードをコピーしてソースコード
IntentService
から貼り付けることができます。1語の注意::過剰なメモリ消費に注意する必要があります。たとえば、処理に単一のバックグラウンドスレッドを使用し、受信データのレートが処理レートより高い場合、キューは絶えず増加します。このような状況では、十分な時間が与えられれば、アプリケーションはOutOfMemory例外でクラッシュします(
IntentService
でも起こります)。この問題が発生した場合、あなたはのいずれかを実行する必要があります:SQLiteのにバックグラウンド処理のための
- 使用する複数のスレッド
- ストアデータを(が、その後のSQLiteが過剰に成長することができます)
- は、いくつかのデータをドロップ
HandlerThreadがあります.Looperにメッセージのキューがあり、すべての作業をバックグラウンドで行います。 –
偉大な答えです。私はバインドされたサービスを使用することを考えていましたが、キューイングの問題は考慮していませんでした。仕事はリアルタイムではありません。サンプルは高速ですが、分析は2番目ほどに計算されます。しかし、私はサンプルを落とすことはできません。 – Hephaestus
これについて考えてみると、できるだけ早くバッファにデータを書き込み(オーバーヘッドはほとんどありません)、アナリティクスを別のスレッドにフォークして、メインUIスレッドがバックアップとドロップを行わないようにしますサンプル。 – Hephaestus
IntentServiceにはインテントインテントのキューが埋め込まれているため、インテントが到着するより遅いインテントを処理すると、実行できます。 しかし、HandlerThreadを使用して、Message内の受信データをその上に投稿します。これにはメッセージキューも組み込まれていますが、IntentServiceの作成と同様にオーバーヘッドはありません。 もう1つのアプローチ - 通常のサービスを使用し、RxJavaライブラリで背圧を処理します。
また、LocalBinderでBound Serviceを使用することも検討しています。これにより、BLEサービスは、アナリティクスサービスを直接呼び出してデータを配置することができます。 HandlerThreadも見ていきます。 – Hephaestus
- 1. SWTを使用した高速ピクセルプロット?
- 2. Racket FFIを使用した高速アレイアクセス
- 3. スムージーチャートリアルタイムの高速データ
- 4. 高速列挙ARCを使用して
- 5. Android:IntentServiceが終了しました
- 6. OpenMPを使用したn回検索の高速化なし
- 7. 高速データモデルでobjective-C++フレームワークのデータ型を使用する
- 8. VBA(Excel)でデータを高速化する高速方法
- 9. サブスクリプションを使用した低速更新のサブスクリプションへの変換(高速?)join
- 10. MATLABとffmpegを使用した高速ムービーの作成
- 11. プロトコルバッファを使用した高速逆シリアル化の提案
- 12. 高速R-CNNを使用したオブジェクト検出
- 13. Accessデータベースを使用したPowerShellスクリプトの高速化
- 14. 一時テーブルを使用した高速SQLクエリですか?
- 15. UITableViewを使用したTweetieの高速スクロール
- 16. NHibernateを使用したバルク挿入操作の高速化
- 17. IMAPプロトコルを使用した電子メールの高速スキャン
- 18. imshow()とmatplotlib.patchesを使用したダイナミックイメージの高速静的円
- 19. 共有アレーを使用したPythonでの高速FFTのメモリアラインメント
- 20. openCVを使用した画像の高速表示
- 21. Java 7の高速で一定のget()を使用したマップ
- 22. ソフトカップルロジックを使用した高速辞書マージ
- 23. シェル(DIR)を使用した高速ディレクトリ一覧
- 24. AVFoundationを使用したビデオ間の高速切り替え
- 25. ホモグラフィを使用した高速パッチ抽出
- 26. INNER JOINを使用したクエリの高速化
- 27. HAVING節を使用したマテリアライズド・ビューの高速リフレッシュ?
- 28. ExcelのVBAを使用した高速フーリエ変換
- 29. 大きなデータセットでRLMResultsを使用した高速列挙
- 30. データテーブルから高速データへの高速挿入
センサーのデータは、Android端末のセンサーからのリモートデバイスからのものであり、* not *であることに注意してください。ちょうどそれをクリアしたかった。 – Hephaestus