Я написал Bluetooth API для подключения к внешнему аксессуару.Способ разработки API заключается в том, что существует множество блокирующих вызовов, таких как getTime
, setTime
, getVolume
, setVolume
и т. Д. Способ, которым они работают, заключается в том, что они создают полезную нагрузку для отправки и вызоваметод с именем sendAndReceive()
, который выполняет некоторую подготовительную работу и в конечном итоге выполняет следующие действия:
byte[] retVal = null;
BluetoothSocket socket = getSocket();
// write
socket.getOutputStream().write(payload);
// read response
if(responseExpected){
byte[] buffer = new byte[1024]; // buffer store for the stream
int readbytes = socket.getInputStream().read(buffer);
retVal = new byte[readbytes];
System.arraycopy(buffer, 0, retVal, 0, readbytes);
}
return retVal;
Проблема заключается в том, что иногда это устройство работает медленно или не отвечает, поэтому я хотел бы установить тайм-аут на этот вызов,Я пробовал несколько способов поместить этот код в задачу потока \ будущего и запустить его с таймаутом, например:
FutureTask<byte[]> theTask = null;
// create new task
theTask = new FutureTask<byte[]>(
new Callable<byte[]>() {
@Override
public byte[] call() {
byte[] retVal = null;
BluetoothSocket socket = getSocket();
// write
socket.getOutputStream().write(payload);
// read response
if(responseExpected){
byte[] buffer = new byte[1024]; // buffer store for the stream
int readbytes = socket.getInputStream().read(buffer);
retVal = new byte[readbytes];
System.arraycopy(buffer, 0, retVal, 0, readbytes);
}
return retVal;
}
});
// start task in a new thread
new Thread(theTask).start();
// wait for the execution to finish, timeout after 6 secs
byte[] response;
try {
response = theTask.get(6L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new CbtException(e);
} catch (ExecutionException e) {
throw new CbtException(e);
} catch (TimeoutException e) {
throw new CbtCallTimedOutException(e);
}
return response;
}
Проблема с этим подходом заключается в том, что я не могу повторно генерировать исключения вметод call, и поскольку некоторые методы генерируют исключения, которые я хочу переслать обратно клиенту API, я не могу использовать эту методологию.
Можете ли вы порекомендовать какой-нибудь другой вариант?Спасибо!