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

标签 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,但它绝对是特定于设备的。

最佳答案

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

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

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

关于java - 蓝牙 InputStream.read() 不会永远返回数据和 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26655624/

相关文章:

java - 如何解决连接设备android studio中显示的模拟器超过一个的问题

android - 让安卓手机冒充蓝牙输入设备(鼠标或键盘)

Android `getSystemService(Context.NSD_SERVICE)` 需要很长时间

iphone - 如何从 iPhone 将通话从一台蓝牙设备转移到另一台蓝牙设备?

android - 自动连接已配对的 BT 设备

java - 在没有 Tomcat 管理器的情况下从 jenkins 自动部署 war 文件

java - Android 通讯录简单库?

java - 使用java在MongoDB中查找数组元素的平均值

java - 从 ArrayList 读取

android - Android剪贴板的最大尺寸