1

私は高頻度でBLE通知からデータを受信し、画面にデータを印刷し、他の周辺機器にデータを送信するAndroidアプリケーションを開発しています。

これは私の状況です:

  1. onCharacteristicChanged コールバックは、10hz で「value」と呼ばれるバイト配列を受け取り、いくつかの float および int 変数でデータをアンパックします

  2. handlerThread に関連付けられた Handler は、30hz ごとに Runnable を開始します。このランナブルはvalueからアンパックされた変数を使用し、新しいデータをいくつかの変数に保存し、ブロードキャストメッセージを UX に送信します

  3. 10hz ごとに別のスレッドがステップ 1 で保存されたデータを使用し、2 がこの変数に対して何らかの数学演算を行い、特性にデータを書き込みます。

上記の手順では、float、double、および int 変数を保存して使用しています。

私は同時実行を処理することを恐れており、ステップ 2 と 3 で同じハンドラ スレッドを使用して同時実行の問題を解決しようと考えています。しかし、他の通知が到着すると、競合状態の問題があると思います:/

他の質問:どのスレッドで oncharacteristicchanged が実行されますか?

私の問題の詳細: oncharacteristicchanged で新しいバイト配列が到着します (10hz の周波数で)、変数のデータをアンパックし、他のスレッド B (30hz で) でこのデータを使用して計算を行います: ux にブロードキャストを送信し、結果を別の場所に保存します。変数; スレッド C はスレッド B の結果を使用し、他の計算を行い、10hz の特性に書き込みます。

oncharacteristicchanged -> スレッド B -> スレッド C

しかし、どのスレッドで実行されるかわからないため、characteristicchanged で停止することはできません..

あなたは

4

1 に答える 1

1

Android はわかりませんが、Java はできます。Androidがわからなくてもお手伝いしますので、行ってみてください!

「上記の手順では、float、double、および int 変数を保存して使用しています。」

まず、AtomicInteger などのスレッド セーフ変数を使用するか、それらを volatile として宣言します。

マルチスレッドによってアクセスされるすべてのメソッドについて、スレッドセーフにすることをお勧めします。Android にクラス Lock があるか、同期されたキーワードがあるかはわかりませんが、そこから始めます。

例:

Lock lock = new ReentrantLock();
try  {
    lock.lock();
    doYourWork();
} finally{
    lock.unlock();
}

それが開始方法です... Androidを知らなくても少しは役に立てば幸いです。何か間違ったことを言って申し訳ありません。

于 2015-09-11T20:57:46.103 に答える