我正在尝试编写一个将执行以下操作的线程:
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时抛出异常?欣赏它!
答案 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()和可用()抛出不起作用。解决这个问题最方便的方法是创建另一个线程来执行其他例程。虽然留下这个线程特别是为了读取输入流和检查输入流状态(抛出异常)。