Я реализую серию характеристических чтений против устройства BLE. Поскольку readCharacteristic()
выполняется асинхронно, и потому, что нам нужно подождать, пока он не завершится до того, как будет выпущен другой "прочитанный" вызов, я использовал блокировку для wait()
, а затем в 'onCharacteristicRead()
я notify()
блокировку, чтобы все было в порядке.
Когда я wait()
после вызова readCharacteristic()
, я никогда не получаю вызов onCharacteristicRead()
. Если я не wait()
, тогда я получаю вызов onCharacteristicRead()
и сообщается правильное значение.
Вот соответствующий код, который, кажется, блокирует обратный вызов onCharacteristicRead()
:
private void doRead() {
//....internal accounting stuff up here....
characteristic = mGatt.getService(mCurrServiceUUID).getCharacteristic(mCurrCharacteristicUUID);
isReading = mGatt.readCharacteristic(characteristic);
showToast("Is reading in progress? " + isReading);
showToast("On thread: " + Thread.currentThread().getName());
// Wait for read to complete before continuing.
while (isReading) {
synchronized (readLock) {
try {
readLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
showToast("onCharacteristicRead()");
showToast("On thread: " + Thread.currentThread().getName());
byte[] value = characteristic.getValue();
StringBuilder sb = new StringBuilder();
for (byte b : value) {
sb.append(String.format("%02X", b));
}
showToast("Read characteristic value: " + sb.toString());
synchronized (readLock) {
isReading = false;
readLock.notifyAll();
}
}
Если я просто удалю оператор while()
выше, я успешно получаю обратный вызов read. Конечно, это мешает мне ждать, чтобы читать дальше, поэтому я не могу двигаться вперед, не дожидаясь.
Учитывая, что readCharacteristic()
является асинхронным, почему выполнение вызывающего потока имеет какое-либо отношение к способности выполнять чтение или возможность вызова обратного вызова?
Чтобы сделать вещи более запутанными, я показываю тост, который идентифицирует поток при вызове readCharacteristic()
, а также при вызове onCharacteristicRead()
. Эти 2 потока имеют разные имена. Я подумал, что, возможно, обратный вызов вызывался по вызывающему потоку по какой-то причине, но это, похоже, не так. Итак, что здесь происходит с потоком?