2014-10-30 67 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()即可获得正确的数据,那么这也是一个错误(也许是同一个方面的另一个方面)。