2014-10-30 28 views
1

我有一些Android藍牙的東西問題。 當我打電話藍牙InputStream.read()不會永久返回數據和塊

bytes = mmInStream.read(buffer); 

它通常工作,因爲它應該。 但是,在Cat B15智能電話上,即使連接仍在運行且數據應該到達,讀取方法有時會永久阻止。 我已經暫時通過這段代碼解決了這個問題:

while (true) { 

    int available = 0; 

    try { 
     available = mInStream.available(); 
    } catch (IOException e) {} 

    if (available > 0) { 
     try { 
      bytes = mInStream.read(buffer); 
      ioExceptionsCounter = 0; 
      // [send the obtained bytes to the UI activity] 
      // ............... 
     } catch (IOException e) { 
      ++ioExceptionsCounter; 
      if (ioExceptionsCounter >= 4) { 
       break; 
      } 
     } 
    } 

    try { 
     Thread.sleep(10); 
    } catch (InterruptedException e) {} 
} 

我不認爲ioExceptionsCounter真的是必要的,但有一些抱怨,有時斷開沒有道理的,所以我想一個IOException異常可能不足以關閉連接。

我真的不喜歡這個,它使用輪詢。它現在可以在Cat手機上工作,但它並不讓我感到高興,所有其他設備現在都執行這個難看的代碼。

你有什麼想法,爲什麼這可能是?這只是一個手機的錯誤?順便說它運行ICS,但它絕對是設備特定的。

+0

我在魅族m2手機中遇到了這個bug。你有沒有找到任何解決方法?在我的代碼上,它提供大約10-15分鐘的數據,每4分鐘發送一次事件。但是之後會阻止。 – user303730 2015-10-28 11:24:12

回答

1

我傾向於認爲您遇到了硬件特定的錯誤。

不同的InputStream.read()方法被記錄爲阻塞,直到至少讀取一個字節,或檢測到流的結束,或發生錯誤。如果read()有時會在您第一次調用時沒有可用字節的情況下永遠阻止您,那麼這絕對是您自己代碼之外的錯誤。

此外,忽略任何數量的IOException s(available()read())是非常值得懷疑的。在流引發異常之後,您無法確信您之後可能會從中讀取的任何內容的完整性。我通常會期望這樣的嘗試在進一步閱讀也扔IOException s。如果您在Cat B15上獲得僞造的IOException s,那麼只需簡單地重試read()即可獲得正確的數據,那麼這也是一個錯誤(也許是同一個方面的另一個方面)。