【问题标题】:Android Bluetooth InputStream.read() Keeps StallingAndroid 蓝牙 InputStream.read() 一直卡住
【发布时间】:2013-12-06 12:46:48
【问题描述】:

我正在使用 InputStream 通过蓝牙从我的 Arduino 读取数据。我正在使用一个单独的线程来执行此操作,因为它不会阻塞 UI 线程。这个线程有一个这种风格的while循环:

while(!stop){

    int instruction = InputStream.read();

    switch(instruction){
         ... //processes data here
    }

}

有时,我需要停止这个线程,并且必须快速完成,因为我要求它在 UI 线程上停止。为了停止线程,我将变量 stop 更改为 true,因此从逻辑上讲,while 循环应该完成并且线程应该退出。

当我将鼠标悬停在读取函数上时,eclipse 说如果到达流的末尾,它将返回 -1。我的问题是这没有发生。如果没有从传感器接收到指令,则读取功能会停止,直到接收到某些内容。它不应该返回 -1 因为流已完成吗?

因为 read() 函数正在停止,我无法停止线程。我会使用 thread.stop();但这已被弃用且不稳定,因此我想避免使用它。我还尝试使用 InputStream.available() 在执行读取之前查看是否有任何可用的内容,但这会返回 0,即使有可供读取的字节也是如此。有人有什么建议吗?

【问题讨论】:

    标签: android multithreading bluetooth android-bluetooth


    【解决方案1】:

    您选择的 read() 方法将阻塞,直到它读取一个字节。您可以通过关闭套接字或流来使其退出。这将导致异常(您需要捕获)。仅供参考 - 您应该使用其他 read() 方法返回读取的字节数。您正在使用的更简单的 read() 方法将返回 -1 用于 0xff 的数据字节和错误的读取。

    【讨论】:

    • 那个还是不行。它只是一直停滞不前,直到有人读完为止。
    • 它的行为方式相同,它会在返回之前等待请求的字节数到达。优点是它返回实际读取的字节数。另一个函数只返回数据。您仍然需要关闭流或套接字以解除对该调用的阻塞,然后处理异常。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多