Помимо занятого ожидания, которое может заблокировать весь процессор и быстро разрядить батарею, я не вижу никакой синхронизации. Существуют общие структуры данных (вероятно, 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;
}
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);
}
bluetoothGatt.writeCharacteristic(customCharacteristic);
}
В этом решении предполагается, что writeCharacteristic
не блокируется и работает быстро. Это безопасное предположение, так как метод асинхронный по своей конструкции: у него есть обратный вызов, который будет вызван после завершения операции.
Таким образом, обратный вызов onCharacteristicWrite
используется для отправки следующего сообщения в буфере. Следовательно, необходимость в потоке исчезает - и, следовательно, исчезает и связанная с этим сложность.
По-прежнему задействовано несколько потоков, поскольку обратный вызов вызывается из фонового потока. Поэтому доступ к общим данным синхронизируется.