2016-03-30 9 views
0

私はスタートボタンを押すといくつかのセンサーをポーリングするサービスが開始され、センサー値が変化するたびにセンサーデータをオブジェクトに保存します。 10msごとに、データベースの挿入が行われ、オブジェクトの現在の値がデータベースに格納されます。これは30分間発生しますAndroid:継続的なSQL挿入のためのブロックまたは非ブロックのキュー?

挿入の速度と持続時間を考えて、これはUIスレッドとは別のスレッドで実行したいので、ナビゲーションにヒットしません。そこで、私のサービスはスレッドにデータを追加してキューに追加し、もう一方のスレッド(コンシューマ)がキューから取り出してデータベースに挿入します

停止ボタンを押すと、スレッドを強制終了する前に残りのキューを処理します。

どこでも私が(例えばLinkedBlockingQueue vs ConcurrentLinkedQueue、またはWhat's the different between LinkedBlockingQueue and ConcurrentLinkedQueue?)ブロッキングキューのいくつかの並べ替えは、プロデューサ/コンシューマタイプの状況のた​​めに推奨され、見て

私の質問は、ブロッキングキューが私の状況では意味を成さない、と思われ?

ほとんどこのアプリケーションで重要なことは、すべてのデータがdbに挿入されることです。私が理解しているところから(私が間違っていると私を修正してください)、キューが一杯になり、コンシューマスレッドがより多くのキュースペースを解放するのに十分速く挿入できない場合、プロデューサはキュー?それでは時間待ち行列に空きスペースがあれば、いくつかのセンサーの読み値は消えてしまい、ブロックのためにdbに挿入されませんでした。

終わりには、ビートをスキップせずに10msごとにデータが挿入されるようにします。私の考えでは、無制限の無制限のキューに値を10msごとにダンプし、消費者ができるだけ早くそれをポーリングしてもらうことが理にかなっています。次にStopを押すと、残りのキューを排水してからスレッドを強制終了します。

だから、1生産者/ 1消費者の状況でこれを処理する正しい方法は何ですか?

答えて

0

私があなただったら、このタスクには単一スレッドのエグゼキュータを使用します。これは、必要な機能が既に付属しています。詳細情報here

関連する問題