1

我正在开发一个 android 应用程序,它高频接收来自 ble 通知的数据,在屏幕上打印数据并将数据发送到其他外围设备。

这是我的情况:

  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

但我不能停止 oncharacteristicchanged 因为我不知道它在哪个线程中执行..

4

1 回答 1

1

我不懂Android,但我会Java。即使不了解Android,我也会尽力帮助您,所以走吧!

“在上面的步骤中,我保存并使用了 float、double 和 int 变量。”

首先,我会开始使用线程安全变量,例如:AtomicInteger 或将它们声明为 volatile。

对于将通过多线程访问的所有方法,我会说使它们成为线程安全的。我不知道在 Android 中是否有类 Lock 或关键字 synchronized,但我会从那里开始。

例子:

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

这就是开始的方式......希望即使我不知道Android也能帮助你一点,如果我说错了什么,我很抱歉。

于 2015-09-11T20:57:46.103 回答