У меня есть Android-приложение Bluetooth, которое управляет несколькими удаленными устройствами ( Capsules ).
Запись данных в поток вывода сокета капсулы работал вчераи после среднего рефакторинга в приложение Android только я получаю следующую ошибку:
java.lang.IllegalMonitorStateException: попытка разблокировать блокировку чтения, не заблокированную текущим потоком.
Вот код создания сокета:
public final void connectWithCapsule(Capsule capsule)
throws Exception {
BluetoothSocket socket = capsulesSockets.get(capsule);
if (socket == null) {
try {
// Method m = capsule.getBT_Device().getClass().getMethod("createRfcommSocket", new Class[]{int.class});
// socket = (BluetoothSocket) m.invoke(capsule.getBT_Device(), Integer.valueOf(17));
socket = capsule.getBT_Device().createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (Exception e) {
logError("Error creating RFcomm socket", e);
throw e;
}
capsulesSockets.put(capsule, socket);
}
try {
socket.connect();
} catch (IOException e) {
logError("Error connecting socket", e);
try {
socket.close();
} catch (IOException e1) {
logError("Error closing socket", e1);
}
capsulesSockets.remove(capsule);
throw e;
}
}
и модель, которая управляет входящими / исходящими потоками:
public final class KitBT_ConnectionModel {
private final OutputStream[] outputStreams;
private final InputStream[] inputStreams;
public KitBT_ConnectionModel(OutputStream[] outputStreams, InputStream[] inputStreams) {
super();
this.outputStreams = outputStreams;
this.inputStreams = inputStreams;
}
public void transmitData(byte[] bs)
throws IOException {
for (OutputStream outputStream : outputStreams) {
outputStream.write(bs); // THIS LINE THROWS THE EXCEPTION
outputStream.flush();
}
}
public InputStream[] getInputStreams() {
return inputStreams;
}
}
Примечание: Я не выполняю никаких действий с обоими потоками, и первая запись вызывает исключение.
Первое, что приходит на ум, - какой поток ставит блокировку чтения икогда?
Я пытался поиграться с потоками, которые вызывают создание сокета, и с транзакциями потоков, которые я сделал уверен , 100% уверен они имеютк обоим обращался один и тот же поток (а также пытался получить доступ с разных потоков), но это исключение сохраняется.
Пожалуйста, просветите меня ...