gpt4 book ai didi

java - 蓝牙 InputStream.read() 不会永远返回数据和 block

转载 作者:行者123 更新时间:2023-11-30 11:12:55 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com