1 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
除了繁忙的等待(這會(huì)阻塞整個(gè) CPU 并快速耗盡電池)之外,我看不到任何同步。有共享數(shù)據(jù)結(jié)構(gòu)(可能是stopMessageThread、characteristicWriteSuccessful和messageQueue)和多個(gè)訪問(wèn)它們的線程。如果沒(méi)有同步,就會(huì)出現(xiàn)競(jìng)爭(zhēng)條件,并且堵塞可能是其表現(xiàn)。
所以我建議采用更簡(jiǎn)單的設(shè)計(jì),特別是沒(méi)有用于發(fā)送消息的線程:
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);
}
該解決方案的假設(shè)是writeCharacteristic不會(huì)阻塞并且速度很快。這是一個(gè)安全的假設(shè),因?yàn)樵摲椒ㄔ谠O(shè)計(jì)上是異步的:它有一個(gè)回調(diào),將在操作完成時(shí)調(diào)用。
因此回調(diào)onCharacteristicWrite用于發(fā)送緩沖區(qū)中的下一條消息。因此,對(duì)線程的需求消失了——相關(guān)的復(fù)雜性也消失了。
當(dāng)從后臺(tái)線程調(diào)用回調(diào)時(shí),仍然涉及多個(gè)線程。因此,對(duì)共享數(shù)據(jù)的訪問(wèn)是同步的。
添加回答
舉報(bào)