在检查套接字连接时,从BlueToothSocket的InputStream中取消阻止读取

时间:2013-04-25 11:00:16

标签: java android exception bluetooth inputstream

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

1。从输入流中读取;

2。其他一些例程;

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

之前已经设置了套接字的BlueTooth套接字和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()并关闭BlueTooth Socket时抛出异常?欣赏它!

2 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

好吧,似乎没有一种简单的方法可以解除阻塞的read()和可用()抛出不起作用。解决这个问题最方便的方法是创建另一个线程来执行其他例程。虽然留下这个线程特别是为了读取输入流和检查输入流状态(抛出异常)。