[英]Timer for inactivity during a loop
我正在編寫一個連接到藍牙設備的應用程序,然后發送消息並獲得答案。 這是我用來獲取答案的代碼:
StringBuilder res = new StringBuilder();
while ((char) (b = (byte) in.read()) != '>') {
if ((char) b != ' ') {
res.append((char) b);
}
}
rawData = res.toString().trim();
基本上,它將每個字符一個接一個地添加到StringBuilder中
當有答案時,沒問題,就可以了。 但是問題在於設備沒有任何答案(因為無論如何連接都斷開了)。
如何限制等待角色的時間?
編輯:
這是我的藍牙連接
final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
_dev = btAdapter.getRemoteDevice(remoteDevice);
try {
Method m;
m = _dev.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
_sock = (BluetoothSocket) m.invoke(_dev, 1);
_sock.connect();
setState(STATE_CONNECTED);
sockIn = _sock.getInputStream();
sockOut = _sock.getOutputStream();
} catch (Exception e) {
closeConnection();
}
使用InputStream的“可用”方法
在讀取之前檢查流中是否有數據而沒有阻塞,並檢查兩次讀取之間的經過時間,以確定是否發生超時(System.getCurrentTimeMillis()應該完成此工作)。
檢查此答案以供參考和完整列表:
在Android的BluetoothSocket inputstream.read()中實現超時
編輯:
如果我正確地閱讀了您的評論的兩行之間,則可以使用藍牙UDP套接字...
可悲的是 ,您似乎無法在Android上通過藍牙使用數據報,因此必須堅持使用TCP。
如果您要在設備之間發送的數據是事件驅動的(例如,您希望設備A上的用戶在設備B上的用戶觸摸屏幕/發射武器等后立即收到通知),您仍然可以調整閱讀循環做你想做的。
您所需要的就是一個工作線程,在該線程中,使循環執行I / O繁重的工作,以及一個處理程序(在UI線程中創建該處理程序),該處理程序將在收到任何內容后立即通知您的選擇。
請記住,我只是在猜測您的使用情況,因此,如果異步事件驅動的通信不是問題,請不要誤導。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.