我寫了一個藍牙API用於連接外部附件。 該API的設計方式是,有一幫阻塞調用,如getTime
,setTime
,getVolume
,setVolume
等 的方式,這些工作是他們創造一個有效載荷發送和呼叫被叫sendAndReceive()
方法,做一些準備工作,並最終執行以下操作:Android BluetoothSocket - 定時輸出
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;
}
這種方法的問題是在,我不能重新拋出異常調用方法,並且由於某些方法會拋出異常,我想將其轉發回API客戶端,因此我無法使用此方法。
你能推薦一些其他的選擇嗎? 謝謝!
沒有這股力量在每次調用6秒的延遲? – ekatz 2011-06-23 14:45:28
不,如果讀取在6秒超時之前完成,則讀取器Thread向調用wrappedSendAndReceive()的Thread發送一箇中斷。 – cyngus 2011-06-23 15:10:08