是否可以通过Android中的BluetoothSocket在inputstream.read()函数中实现超时?
我尝试过使用Thread.sleep(),但这只会暂停我的活动。
--- ---更新
我有一个想法,在这里编写2个线程代码(t1& t2),其中每个线程中断其他线程,其中一个(t1)进行休眠(5000)然后从另一侧中断另一个线程(t2)另一个线程(t2)如果在读取时输入流检测到一些字符为0x0D中断另一个线程(t1),但这是我的问题,有人可以帮助我吗?因为我没有使用线程的interrupt()方法,希望有人能帮助我,谢谢...
--- ---更新
public void run(){
while(true){
try {
char r;
String respuesta = "";
while (true) {
r = (char) mmInStream.read();
respuesta += r;
if (r == 0x3e) {
break;
}
}
respuesta = respuesta.replaceAll(" ", "");
Log.d("respuesta", respuesta);
rHandler.obtainMessage(MESSAGE_READ, -1, -1, respuesta).sendToTarget();
} catch (IOException readException) {
Log.e("ServicioGeneral", "Error de lectura", readException);
this.interrupt();
connectionLost();
// posibly break();
}
}
}
这是我的实现,当某些东西进入不同的线程时,问题是如果我没有从de mmInStream获得0x3e字符,将达到超时。
我认为在第二个例子中我必须使用notifyAll(),但是,我何时必须启动readThread()?
谢谢你,@ weeman
答案 0 :(得分:10)
你可以这样做:
InputStream in = someBluetoothSocket.getInputStream();
int timeout = 0;
int maxTimeout = 8; // leads to a timeout of 2 seconds
int available = 0;
while((available = in.available()) == 0 && timeout < maxTimeout) {
timeout++;
// throws interrupted exception
Thread.sleep(250);
}
byte[] read = new byte[available];
in.read(read);
这样,您最初可以从具有特定超时的流中读取。如果你想在任何阅读时间实现超时,你可以尝试这样的事情:
Thread readThread = new ReadThread(); // being a thread you use to read from an InputStream
try {
synchronized (readThread) {
// edit: start readThread here
readThread.start();
readThread.wait(timeOutInMilliSeconds);
}
catch (InterruptedException e) {}
使用此方法,如果线程实际从输入流中读取内容,您可能需要某种事件处理程序来通知您的应用程序。
我希望有所帮助!
----编辑:
我在不使用任何处理程序的情况下实现了一个示例。
Socket s = new Socket("localhost", 8080);
final InputStream in = s.getInputStream();
Thread readThread = new Thread(new Runnable() {
public void run() {
int read = 0;
try {
while((read = in.read()) >= 0) {
System.out.println(new String(new byte[]{ (byte) read }));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
synchronized (readThread) {
readThread.start();
try {
readThread.wait(2000);
if(readThread.isAlive()) {
// probably really not good practice!
in.close();
System.out.println("Timeout exceeded!");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 1 :(得分:1)
用于超时读取套接字的Kotlin扩展功能:
fun InputStream.read(
buffer: ByteArray,
offset: Int,
length: Int,
timeout: Long
): Int = runBlocking {
val readAsync = async {
if (available() > 0) read(buffer, offset, length) else 0
}
var byteCount = 0
var retries = 3
while (byteCount == 0 && retries > 0) {
withTimeout(timeout) {
byteCount = readAsync.await()
}
delay(timeout)
retries--
}
byteCount
}