1

我正在尝试编写一个线程来执行以下操作:

1. 从输入流中读取;

2. 一些其他的例行公事;

3.如果socket关闭,抛出异常。

蓝牙 Socket 和来自套接字的 inputStream 在此之前已经设置好了。代码如下:

public void run() {
    byte[] buffer = new byte[1024];
    int bytes;

    while (true) {
        try {
            //if(mInputStream.available() > 0){        //-------- Line 1
            bytes = mInputStream.read(buffer);
            //}                                      //-------- Line 2

            //---------------------//
            // some other routines //
            //---------------------//

        } catch (IOException e) {
            connectionLost();
            break;
        }               
    }
}

问题是上面的代码会因为阻塞而挂在mInputStream.read()处。但是,如果我取消注释第 1 行和第 2 行,即使 BlueToothSocket 关闭, mInputStream.available()函数也不会抛出异常。是否有任何方法可以解除阻塞读取功能,或者在使用 available() 并关闭蓝牙套接字时抛出异常?欣赏它!

4

2 回答 2

1

这就是我使用的:

private boolean receivedInTimelyManner(InputStream mInStream,
        int bytesToReceive, long timeoutMillis) throws IOException,
        InterruptedException {

    long time = 0;
    while (mInStream.available() < bytesToReceive && time < timeoutMillis) {

        time+=5;
        Thread.sleep(5);
    }
    if (time == timeoutMillis) {
        return false;
    }
    return true;

}

用类似的东西包围你的阅读块:

if receivedInTimelyManner(instream,bytes,timeout){
    read()
}
于 2014-10-08T20:39:17.280 回答
0

好的,似乎没有一种简单的方法可以进行畅通的 read() 和 available() 抛出不起作用。解决这个问题的最方便的方法是创建另一个线程来执行其他例程。而不要管这个线程,特别是用于读取输入流和检查输入流状态(抛出异常)。

于 2013-05-06T09:50:05.717 回答