2013-05-27 44 views
1

我正在編寫一個連接到藍牙設備的應用程序,然後發送消息並獲得答案。這是我使用得到的答案代碼:定時器在循環中處於非活動狀態

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(); 
    } 
+0

你如何連接藍牙?我認爲你可以暫停連接。 – mromer

回答

1

使用InputStream的 「可用」 的方法

reference page for InputStream

,以檢查是否有數據流中讀取無前阻塞,並檢查讀取之間的經過時間,以確定是否發生超時(System.getCurrentTimeMillis()應該完成這項工作)。

檢查這個答案以供參考和完整列表:

Implement a timeout in BluetoothSocket inputstream.read() in Android

編輯:

如果我正確線之間,從您的評論閱讀,你真的可以使用藍牙UDP socket ...

可悲的是它似乎你不能在Android上使用藍牙數據報,因爲你必須堅持使用TCP。

如果您想在設備之間發送的數據是事件驅動的(例如,您希望設備A上的用戶在設備B上的用戶觸摸屏幕/觸發他的武器等時立即收到通知),您仍然可以調整你的閱讀循環來做你想做的事。

所有你需要的是一個工作線程,讓循環完成I/O繁重工作,以及一個Handler(在UI線程中創建它),一旦你收到任何東西,它就會通知你選擇的一個Listener。

請記住,我只是在猜測您的使用場景,所以如果異步事件驅動的通信不是問題,請不要誤導。

希望這會有所幫助

+0

如果我理解的很好,在這個例子中,你檢查InputStream是否有一些字節,然後你開始閱讀它。這對我造成了一個問題,只要我需要非常快速地得到答案信息 無論如何,我會試試這個,看看它是否可以在沒有計時器循環的情況下工作 – WhiskThimble

+0

我已經擴展了我的答案,但我不確定是什麼問題是。 「我需要非常快地得到答案信息」是什麼意思?據我所知,你會得到答案的速度將主要取決於你的同行發送它的速度有多快...... – Rick77

+0

我正在編寫的應用程序有點特別。當我用我的android設備寫入一些命令時,其他藍牙設備(根本不是Android)發送答案。我需要非常快速地得到這個答案,這就是爲什麼我會盡量減少循環中的'Thread.sleep(someTime);'。反射後,如果睡覺的時間確實很短(可能是5毫秒),這應該不會太慢。 感謝您的完整答案 – WhiskThimble

相關問題