java - 在检查套接字的连接时从 BlueToothSocket 的 InputStream 中畅通读取

标签 java android exception bluetooth inputstream

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

1.从输入流中读取;

2.一些其他的例程;

3.如果套接字已关闭,则抛出异常。

BlueTooth 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() 并关闭蓝牙套接字时抛出异常?欣赏它!

最佳答案

这是我用的:

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;

}

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

if receivedInTimelyManner(instream,bytes,timeout){
    read()
}

关于java - 在检查套接字的连接时从 BlueToothSocket 的 InputStream 中畅通读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212984/

相关文章:

java - 我正在尝试使用文件中的数据创建一个数组

java - 通过android中的接口(interface)将gcm注册ID从GCMBaseIntentService类传递到MainActivity

java - 缺少Gradle文件的Android Studio同步项目

android - 如何使用支持操作栏将默认主页显示为向上指示器?

java - ClassNotFoundException : dataimport. 数据导入处理程序

python - 是否可以在抛出异常时自动进入调试器?

java - 在 Activity 之间传递和显示 json 数据不起作用?

java.lang.IllegalArgumentException : The servlets named [abc] and [Testing] are both mapped to the url-pattern [/welcome] which is not permitted 异常

java - Android : surfaceView cannot getHolder() in onCreate(), 必须在 onResume() 中

java - 检查方法在应用于值列表的任何元素时是否抛出异常