1 回答
TA贡献1856条经验 获得超11个赞
除了繁忙的等待(这会阻塞整个 CPU 并快速耗尽电池)之外,我看不到任何同步。有共享数据结构(可能是stopMessageThread、characteristicWriteSuccessful和messageQueue)和多个访问它们的线程。如果没有同步,就会出现竞争条件,并且堵塞可能是其表现。
所以我建议采用更简单的设计,特别是没有用于发送消息的线程:
private ArrayList<byte[]> messageQueue = new ArrayList<byte[]>();
private boolean isSending = false;
void sendMessage(byte[] message) {
synchronized (this) {
if (isSending) {
messageQueue.add(message);
return;
}
isSending = true;
}
customCharacteristic.setValue(message);
bluetoothGatt.writeCharacteristic(customCharacteristic);
}
public void onCharacteristicWrite (BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
byte[] message;
synchronized (this) {
if (messageQueue.size() == 0) {
isSending = false;
return;
}
message = messageQueue.remove(0);
}
customCharacteristic.setValue(message);
bluetoothGatt.writeCharacteristic(customCharacteristic);
}
该解决方案的假设是writeCharacteristic不会阻塞并且速度很快。这是一个安全的假设,因为该方法在设计上是异步的:它有一个回调,将在操作完成时调用。
因此回调onCharacteristicWrite用于发送缓冲区中的下一条消息。因此,对线程的需求消失了——相关的复杂性也消失了。
当从后台线程调用回调时,仍然涉及多个线程。因此,对共享数据的访问是同步的。
添加回答
举报