我遇到了Android蓝牙问题。 当我打电话
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 :(得分:1)
我倾向于认为您遇到了特定于硬件的错误。
记录各种InputStream.read()
方法以阻止,直到读取至少一个字节,或检测到流的末尾,或发生错误。如果read()
有时会在第一次调用时没有字节可用时永远阻塞,那么这肯定是你自己代码之外的错误。
此外,从IOException
或available()
忽略任意数量的read()
是非常值得怀疑的。在流抛出异常之后,您无法确信之后可能会从中读取的任何内容的完整性。我通常期望这种进一步阅读的尝试也会抛出IOException
。如果您在Cat B15上遇到虚假的IOException
,那么只需重试read()
成功获取正确的数据,那么这也是一个错误(可能是同一个错误的另一个方面)。