我已经编写了一个用于连接外部配件的蓝牙API。
该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;
问题是有时这个设备变得缓慢或无响应,因此我想在这个调用上设置超时。
我尝试了几种方法来将这段代码放入线程\future任务中,并使用超时运行它,例如:
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;
}
这种方法的问题在于我无法在调用方法中重新抛出异常,而且由于一些方法会抛出异常,我希望将这些异常转发回API的客户端,所以我不能使用这种方法。
你能推荐其他的替代方案吗? 谢谢!