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

时间:2014-10-30 14:26:09

标签: java android bluetooth

我遇到了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但它绝对是特定于设备的。

1 个答案:

答案 0 :(得分:1)

我倾向于认为您遇到了特定于硬件的错误。

记录各种InputStream.read()方法以阻止,直到读取至少一个字节,或检测到流的末尾,或发生错误。如果read()有时会在第一次调用时没有字节可用时永远阻塞,那么这肯定是你自己代码之外的错误。

此外,从IOExceptionavailable()忽略任意数量的read()是非常值得怀疑的。在流抛出异常之后,您无法确信之后可能会从中读取的任何内容的完整性。我通常期望这种进一步阅读的尝试也会抛出IOException。如果您在Cat B15上遇到虚假的IOException,那么只需重试read()成功获取正确的数据,那么这也是一个错误(可能是同一个错误的另一个方面)。