我在使用 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,但它绝对是特定于设备的。
最佳答案
我倾向于认为您遇到了硬件特定的错误。
各种 InputStream.read()
方法被记录为阻塞,直到至少读取一个字节,或检测到流的末尾,或发生错误。如果 read()
有时在第一次调用时没有可用字节的情况下为您永远阻塞,那么这肯定是您自己的代码之外的错误。
此外,忽略来自 available()
或来自 read()
的任何数量的 IOException
也是非常值得怀疑的。在流抛出异常后,您无法确信您之后可能设法从中读取的任何内容的完整性。我通常希望这种进一步阅读的尝试也会抛出 IOException
。如果您在 Cat B15 上收到虚假的 IOException
,以至于只需重试您的 read()
即可成功获取正确的数据,那么这也是一个错误(也许是另一个方面同一个)。
关于java - 蓝牙 InputStream.read() 不会永远返回数据和 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26655624/